SQLAlchemy の組み込みジェネレーターはメモリ効率の高い反復を提供しますか?
SQLAlchemy を利用すると、データベースのかなりの部分に対して多数のクエリが実行されます。 MySQL テーブルでは過剰なメモリ消費が発生する可能性があります。この問題は、組み込みジェネレーターがデータを一口サイズのチャンクでフェッチすると仮定しているにもかかわらず、依然として発生します。これを軽減するために、ユーザーはカスタム イテレータの作成に頼ってきました。
しかし、SQLAlchemy の動作を詳しく調べると、ほとんどの DBAPI 実装は取得時に行をバッファリングし、SQLAlchemy ORM が結果を処理する前であってもメモリの消費につながることがわかります。 。さらに、クエリのデフォルトの操作では、オブジェクトをユーザーに返す前に結果セットを完全にロードします。
複雑なクエリの場合、結果の整合性を確保することでこの動作が正当化されます。ただし、単純な SELECT ステートメントの場合、Query はこの機能を変更する yield_per() オプションを提供し、バッチで行を生成できるようにします。 yield_per() を使用する場合は注意が必要です。アプリケーションについての高度な理解が必要であり、基盤となる DBAPI が行を事前バッファリングする場合には効果が低くなるためです。
より効率的なアプローチには、ウィンドウ関数を利用することが含まれます。データ チャンクを表す一連の「ウィンドウ」値をプリフェッチすることにより、ユーザーは特定のウィンドウを対象とする個別の SELECT ステートメントを生成できます。この方法では、OFFSET 値の増加に伴うパフォーマンスの低下を引き起こす OFFSET と LIMIT の制限を回避します。
効率を最大化するには、PostgreSQL、Oracle、または SQL Server の使用を検討してください。これらのデータベースはウィンドウ関数をサポートしているためです。
以上がSQLAlchemy の `yield_per()` は本当に大規模な MySQL クエリに対してメモリ効率の高い反復を提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。