[解決済み] なぜ大きな Django QuerySet を繰り返し処理すると、大量のメモリを消費するのですか?
質問
問題のテーブルはおよそ1,000万行を含んでいます。
for event in Event.objects.all():
print event
この結果、メモリ使用量は4GB程度まで順調に増加し、その時点で行が急速に印刷されるようになりました。最初の行が印刷されるまでの長い遅延には驚きました。ほとんど瞬時に印刷されると思っていたからです。
また、私は
Event.objects.iterator()
も試してみましたが、同じような挙動でした。
Django が何をメモリにロードしているのか、なぜこのようなことをするのか、理解できません。私は Django がデータベースレベルで結果を繰り返し処理することを期待していました。
私は何を誤解しているのでしょうか?
(関係あるかわかりませんが、PostgreSQLを使用しています)
どのように解決するのですか?
ネイトCは惜しかった。
から ドキュメント :
QuerySetは以下の方法で評価することができます。
反復。QuerySetは反復可能であり、最初に反復するときにそのデータベースクエリを実行します。例えば、これはデータベース内の全エントリーの見出しを表示します。
for e in Entry.objects.all(): print e.headline
つまり、1000 万行は、最初にループに入り、クエリセットの反復形式を取得するときに、一度に取得されるのです。 あなたが経験する待ち時間は、Django がデータベースの行をロードし、実際に反復処理できるものを返す前に、それぞれの行のオブジェクトを生成しているのです。 そして、全てをメモリに収め、結果がこぼれ落ちてくるのです。
ドキュメントを読んだ限りでは
iterator()
はQuerySetの内部キャッシュ機構をバイパスする以上のものではありません。 1つ1つを処理するのは理にかなっていると思いますが、その場合、逆にデータベースへの個別のアクセスが1,000万回必要です。 たぶん、それほど望ましいことではありません。
大規模なデータセットを効率的に反復処理することは、私たちがまだ完全に理解していないことですが、あなたの目的に役立つと思われるスニペットがいくつか存在します。
関連
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] アドホッククエリとは何ですか?
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] 文字列の一部をUPDATEおよびREPLACEする。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] SQL/mysql - Select distinct/UNIQUE but return all column?