ネイトCは近かったが、完全ではなかった。
ドキュメントから:
次の方法でQuerySetを評価できます。
反復。 QuerySetは反復可能であり、最初に反復したときにデータベースクエリを実行します。たとえば、これにより、データベース内のすべてのエントリの見出しが出力されます。
for e in Entry.objects.all(): print e.headline
したがって、最初にそのループに入り、クエリセットの反復形式を取得すると、1,000万行が一度に取得されます。発生する待機は、Djangoがデータベース行をロードし、各行のオブジェクトを作成してから、実際に反復できるものを返すことです。そうすれば、すべてがメモリに保存され、結果が流出します。
ドキュメントを読んだところ、iterator()
QuerySetの内部キャッシュメカニズムをバイパスするだけです。 1つずつ実行するのは理にかなっていると思いますが、逆に言えば、データベースで1,000万回の個別ヒットが必要になります。それほど望ましいとは限らないかもしれません。
大規模なデータセットを効率的に反復することは、まだ完全には正しく行われていませんが、目的に役立つと思われるスニペットがいくつかあります。
- メモリ効率の高いDjangoQuerySetイテレータ
- バッチクエリセット
- QuerySet Foreach