2012-03-23 4 views
2

私はmongoengine(pythonで)にメモリの問題があります。mongoengine(python)を使ってlazilyデータベースに問い合わせることは可能ですか?

私は非常に大量のcustom_documents(数千)を持っているとしましょう。 私はこのように、それらすべてを処理したい:私はそれがより多くのメモリ賢明にするために行うことができますどのように

...

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

問題は、メモリ内のすべてのオブジェクトcustom_documents.objects()負荷であり、私のアプリはいくつかのGBを使用します? mongoengineをDBに遅延クエリする方法はありますか(クエリセットを繰り返し処理するときにオブジェクトを要求します)?

答えて

4

私の経験では、docsによると、collection.objectsは怠け者QuerySetを返します。あなたの最初の問題は、単にiterableとして使用するのではなく、objects属性を呼び出すことです。私はあなたのアプリが多量のメモリを使用している他の理由があるに違いないように感じています。おそらくprocess(object)は何とかそれを参照していますか?次のコードを試してみて、あなたのアプリケーションのメモリ使用量を確認してください:怠惰です

queryset = custom_documents.objects 
print queryset.count() 

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

+0

あなたが正しいと言えば、問題は私のプロセス機能のどこかに参照を格納していました。答えてくれてありがとう :) – Oos

1

は、私はあなたがクエリセットを見てみたいと思います - これらは、カーソルのMongoEngineラッパーです:

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

彼らはあなたがオブジェクトの数は、基本的にバッチサイズの設定などの世話をして、返さ制御できますあなたはpymongoドライバーに直接設定できること:

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

カーソルが、一般的にデフォルトでこのように動作するように設定されている、あなたは彼らがRETために取得しようとする必要がありますネイティブのmongodbシェルでさえも、すべてのものをワンショットで処理できます。

関連する問題