4

mongoengine(Python)でメモリの問題があります。

非常に大量のcustom_documents(数千)があるとしましょう。私はこれらすべてを次のように処理したいと思います:

for item in custom_documents.objects():
    process(item)

問題はcustom_documents.objects()、メモリ内のすべてのオブジェクトをロードし、私のアプリが数GBを使用することです...

どうすればもっとメモリを賢くすることができますか?mongoengineがDBを遅延クエリするようにする方法はありますか(クエリセットを反復処理するときにオブジェクトを要求します)?

4

2 に答える 2

7

ドキュメントによると(そして私の経験では)、collection.objectsは怠惰なを返しますQuerySet。最初の問題は、objects属性を単に反復可能として使用するのではなく、属性を呼び出していることである可能性があります。あなたのアプリが非常に多くのメモリを使用している他の理由があるに違いないと思います、おそらくprocess(object)それへの参照を何らかの形で保存しますか?次のコードを試して、アプリのメモリ使用量を確認してください。

queryset = custom_documents.objects
print queryset.count()

QuerySets怠惰なので、custom_documents.limit(100).skip(500)オブジェクト500〜600のみを返すために同様のことを行うことができます。

于 2012-03-23T15:10:09.190 に答える
1

クエリセットを確認したいと思います。これらはカーソル用のMongoEngineラッパーです。

http://mongoengine.org/docs/v0.4/apireference.html#querying

返されるオブジェクトの数を制御できます。基本的に、pymongoドライバーで直接設定できるバッチサイズの設定などを処理します。

http://api.mongodb.org/python/current/api/pymongo/cursor.html

カーソルは通常、デフォルトでこのように動作するように設定されています。ネイティブのmongodbシェルであっても、すべてを1回のショットで返すようにする必要があります。

于 2012-03-23T15:03:06.660 に答える