2016-11-11 10 views
2

私はZodbを一般的な辞書形式(キー、値)の形式で使用していました。 しかし、私は次の警告メッセージだZODBに格納しながら:ZODBまたはPythonの大容量データストレージ用の他のデータベース

C:接続\ \のpython-3.5.2.amd64 \ libには\サイト - パッケージ\ ZODBを。 py:550: UserWarning:保存しているオブジェクト が大きいです。 (510241658バイト)

おそらく、あなたはブロブに保存する必要があるメディアを保存しています。

おそらく、 PersistentMappingやPersistentListなどのスケーラブルでないデータ構造を使用している可能性があります。

おそらく、永続性のないオブジェクトにデータを格納している可能性があります。 このような場合、データは、永続オブジェクトである を含むレコードに格納されます。

いずれにしても、この大きなレコードを格納することはおそらく悪い考えです。あなたが主張し、この警告を取り除きたい場合は

は、より大きな サイズを指定するZODB.DBコンストラクタ(または構成ファイル内 大レコードサイズオプション)の large_record_sizeオプションを使用します。

warnings.warn(large_object_messageの%(OBJ。クラス、LEN(P)))

は私がZODBで大容量のデータを格納する方法を提案するか、この目的

答えて

1

大きなデータを格納するためにZODBのネイティブBLOBサポートを使用します。ローカルファイルシステムではサポートされていないクラウドストレージの種類にアプリケーション固有のニーズがある場合を除き、他のものはアンチパターンです。

あなたが保存しているものやストレージ構成がどのようなものなのかは言いませんでしたが、適切なアプローチではBLOBを使用することは不変です。

動作方法:Blob APIは、ラッパー永続オブジェクト(通常はプライマリ永続オブジェクトの属性として参照される)のOIDを使用してオブジェクトを格納します。ラッピングオブジェクトのOID(内部ZODBオブジェクトID)は、BLOBデータを検索し、設定したBLOBストレージからフェッチするなどのキーとして使用されます。

通常、これはアプリケーションのファイルシステム上の単なるファイルですが、データベースサーバーのファイルシステム(構成に応じて、ZEOまたはRelStorageの背後にあるRDBMS)に格納することもできます。 PostgreSQLのバックエンドからRelStorageなどの一部のデータベースで、ZODB(RelStorage経由)がオフロードするネイティブBLOBストレージメカニズムを使用してBLOBを格納できる可能性があります。

参考文献:

  1. https://ziade.org/2007/09/14/to-blob-or-not-to-blob/

  2. https://stackoverflow.com/a/14645205/835961

  3. 便利なライブラリ:

    z3c.blobfile(ZPL-ライセンス)

    b。 plone.namedfile(BSDライセンス)

+1

@WAS私は言及すべきことは、あなたが今やっていることは、一度に一度にロードしなければならない本当に大きなピックルを保管していて、ストリーミングできないことです。ショーストッパーであるHTTP Rangeリクエスト(プログレッシブストリーミング)などの場合大規模なプロダクションアプリケーションでZODBを使用している人は、BLOBを使用し、通常、Web /ネットワークアプリケーションで動作するファイルストレージイテレータにファイルデータをストリーミング配信します。これはZope 2でうまくいきますが、アプリケーションをバイパスしてBLOBに向かうフロントエンドのWebサーバーから直接X-Sendfileなどのアプリケーションを利用するためのアプローチもあります。 – sdupton

1
のために他のライブラリを提案してください

ファイルシステムにオブジェクトを格納し、通常のデータベースを使用するのと同じようにzodbにオブジェクトを参照する必要があります。

+0

あなたは精緻化できますか? – WAS

+0

これは「ほとんど」の回答です。 ZODBにはBLOB APIがあり、BLOBデータを参照してロードする正しい方法です。他の種類の「参照」をファイルに使用することは、おそらくアンチパターンです。 – sdupton

関連する問題