sql >> データベース >  >> RDS >> PostgreSQL

大量のメモリを消費する大規模なDjangoQuerySetを反復処理するのはなぜですか?

    ネイトCは近かったが、完全ではなかった。

    ドキュメントから:

    次の方法でQuerySetを評価できます。

    • 反復。 QuerySetは反復可能であり、最初に反復したときにデータベースクエリを実行します。たとえば、これにより、データベース内のすべてのエントリの見出しが出力されます。

      for e in Entry.objects.all():
          print e.headline
      

    したがって、最初にそのループに入り、クエリセットの反復形式を取得すると、1,000万行が一度に取得されます。発生する待機は、Djangoがデータベース行をロードし、各行のオブジェクトを作成してから、実際に反復できるものを返すことです。そうすれば、すべてがメモリに保存され、結果が流出します。

    ドキュメントを読んだところ、iterator() QuerySetの内部キャッシュメカニズムをバイパスするだけです。 1つずつ実行するのは理にかなっていると思いますが、逆に言えば、データベースで1,000万回の個別ヒットが必要になります。それほど望ましいとは限らないかもしれません。

    大規模なデータセットを効率的に反復することは、まだ完全には正しく行われていませんが、目的に役立つと思われるスニペットがいくつかあります。

    • メモリ効率の高いDjangoQuerySetイテレータ
    • バッチクエリセット
    • QuerySet Foreach


    1. SQLServerデータベースのすべてのチェック制約のリストを取得する方法-SQLServer/TSQLチュートリアルパート85

    2. 更新部分で新しい値と古い値の両方を使用できるようにUPSERTを実行する方法

    3. 失敗したすべてのSQLステートメントをOracle10Gに記録する方法はありますか

    4. Oracleのテーブル/列/インデックス名が30文字に制限されているのはなぜですか?