2011-07-20 9 views
0

私はこのようなQuerySetをDjangoに持っています。Django - "for" on QuerySetで大量のメモリを使用する

j = piosenki.objects.select_related('projekt__postac').distinct().exclude(typ__in=["live", "remix"]).filter(piosenki__plyta__status=1, piosenki__plyta__typ='s') 
.extra(select={ 'ocena' : 'dobroc', 'plyta' : 'SELECT plyta_id FROM plyty_piosenki INNER JOIN plyty_plyty ON plyty_plyty.id = plyty_piosenki.plyta_id WHERE piosenka_id = muzyka_piosenki.id AND plyty_plyty.typ = \'s\' ORDER BY plyty_plyty.id DESC LIMIT 1' }) 

単純に "ID" メモリをプリントfor文ととIループ処理が完了するまで、成長し続けて...

[1286986.701097] Killed process 4627 (python2.6) total-vm:731872kB, anon-rss:635724kB, file-rss:268kB 
[1286986.768701] python2.6: page allocation failure. order:0, mode:0x201da 
[1286986.768705] Pid: 4627, comm: python2.6 Not tainted 2.6.39-gentoo-r2 #1 

任意の提案は?私はDjangoが結果をメモリにロードすることを知っていますが、Postgresはテーブルのサイズを約200 MBと報告しています。

+0

テーブルの大きさはどのくらいですか?また、あなたのループのためのあなたのdjangoテンプレートコードを投稿することができますか? – Jordan

+0

"しかし、Postgresはテーブルのサイズを約200 MBと報告しています。だから、" j:print w.idで私は簡単です。 – ThomK

+0

すべての行を選択していますか?また、いくつかの結合と余分なものがあるため、何らかの理由で結合された表が200MBを超えることがあります。 FWIWは、死ぬと最大750MBになるようです。 – Jordan

答えて

2

まず、並べ替えや結合を行うフィールドにdb_indexを必ず使用してください。第二に、queryset iteratorsを試してみてください。

多数のオブジェクトを返すクエリセットのために、より優れた性能で、このしばしば 結果とメモリ

の大幅な削減
+1

また、settings.pyにDEBUG = Falseを指定してください。それ以外の場合は、実行しているすべてのSQLクエリ(RAMを使用)を覚えています。 – msanders

0

あなたはモデルインスタンスを必要としない場合、または特定のフィールドのみが返された場合は、values/values_listを使用して、モデルが持つフィールドのサブセットのみを選択し、すべての結果に対してモデルインスタンスを初期化しません。

関連する問題