1

Web ページを取得し、それらに関するいくつかの重要な情報をオブジェクトに抽出し、それを ZODB データベースに書き込むソフトウェアを作成しています。これらのオブジェクトのうち約 350,000 個がデータベースに書き込まれることになります。

私のコードがしばらく実行された後、データベースに新しいオブジェクトを追加するたびにこのメッセージを投稿し始めました...

UserWarning: The <class 'persistent.mapping.PersistentMapping'>
object you're saving is large. (26362014 bytes.)
Perhaps you're storing media which should be stored in blobs.

Perhaps you're using a non-scalable data structure, such as a
PersistentMapping or PersistentList.

Perhaps you're storing data in objects that aren't persistent at
all. In cases like that, the data is stored in the record of the
containing persistent object.

In any case, storing records this big is probably a bad idea.

だから私の質問はまず第一に、エラーメッセージが追加されている単一のオブジェクトまたはデータベース全体のものとして言及している26MBです。これらの各オブジェクトは非常に小さいはずですが、新しいオブジェクトが追加されるたびにメッセージが表示されます。

4

1 に答える 1

5

PersistentMapping26MB は、オブジェクト全体に対して生成される「ピクルス」のサイズです。メッセージが示すように、PersistentMappingスケーラブルではありません: キーと値のペアをもう 1 つ追加してトランザクションをコミットすると、その 26MB (および追加した単一の新しいペアのサイズ)が再び書き出されます。インスタンスを変更してコミットするたびPersistentMappingに、オブジェクト全体 (以前に追加したすべてのオブジェクトを含む) がディスクに保存されます。一連の追加とコミットにわたって、これにより、追加したアイテムの数の2 次の合計データベース サイズが得られ、2 次の時間動作も発生します (追加する新しいアイテムは、最後に追加されたアイテムよりも時間がかかります。これは、各コミットが書き出すためです)最後に追加されたアイテムだけでなく、以前に追加されたすべてのアイテムも含まれます)。

BTreeZODB サポートのさまざまなフレーバーについては、ドキュメントを参照してください。これらはスケーラブルで永続的なキーと値のマッピングであり、ほぼ確実にこのタスクに使用する必要があります。

ZODB はBTree、効率を高めるために のいくつかのフレーバーを実装していることに注意してください。最も一般的なのは でOOBTree、キーと値の両方に一般的なオブジェクトを使用できます。最も具体的なのは、IIBTreeキーと値に 32 ビット整数のみを許可する です。チュートリアルは次のとおりです。

http://pythonhosted.org/BTrees

于 2013-09-14T05:06:50.250 に答える