SqlAlchemy でのメモリ効率の高い反復について
SqlAlchemy を使用して MySQL で大規模なデータセットを処理する場合、メモリ消費が問題になることがあります。次のような組み込みジェネレータ構文は、期待したほどメモリ効率が良くない可能性があります:
for thing in session.query(Things): analyze(thing)
基礎的なメモリ消費
ほとんどの DBAPI 実装のバッファ行取得されたままです。これは、SqlAlchemy が最初の結果を取得する前に、結果セット全体がメモリ内に存在する可能性があることを意味します。
クエリのデフォルト動作
SqlAlchemy の Query オブジェクトは通常、結果セット全体を読み込みます。オブジェクトを返す前にメモリに格納します。これは、重要な SELECT ステートメントを含むクエリが原因です。ただし、Query には、この動作を変更するための「yield_per()」オプションが用意されています。
yield_per()
「yield_per()」オプションにより、Query は行を生成します。指定されたサイズのバッチ。これによりメモリ使用量が向上しますが、注意が必要です。これは、コレクションの積極的な読み込みを実行しない場合にのみ適切です。さらに、DBAPI が行を事前バッファリングする場合、メモリの節約が制限される可能性があります。
ウィンドウ関数によるアプローチ
「yield_per()」の代わりにウィンドウを使用することもできます。機能的なアプローチ。これには、テーブルのチャンクを参照する「ウィンドウ」値をプリフェッチし、これらのウィンドウから一度に 1 つずつ取得する個々の SELECT ステートメントを発行することが含まれます。このアプローチは、オフセットが大きい場合の "LIMIT" と "OFFSET" のパフォーマンス低下を回避するのに役立ちます。
結論
SqlAlchemy の組み込みジェネレーターは便利ですが、常に最適なメモリ効率が得られるわけではありません。基礎となるメモリ消費を理解し、「yield_per()」やウィンドウ関数などの代替アプローチを利用すると、大規模なデータセットを操作する際のメモリの問題を軽減できます。
以上がSQLAlchemy でメモリを過剰に消費せずに大規模なデータセットを効率的に反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。