大量のデータを解析するアプリケーションを開発しましたが、すべてのデータを解析した後にデータをコミットすると、メモリを消費しすぎます。ただし、ハード ディスク I/O のコストがかかりすぎるため、毎回コミットすることはできません。
したがって、私の質問は、セッション内にコミットされていないアイテムがいくつあるかをどのように知ることができますか?
大量のデータを解析するアプリケーションを開発しましたが、すべてのデータを解析した後にデータをコミットすると、メモリを消費しすぎます。ただし、ハード ディスク I/O のコストがかかりすぎるため、毎回コミットすることはできません。
したがって、私の質問は、セッション内にコミットされていないアイテムがいくつあるかをどのように知ることができますか?
session.newを使用できます。これは、作成されたばかりでコミットされていないオブジェクトのコレクションです。session.dirtyも便利です。ドキュメントを引用するには:
# pending objects recently added to the Session
session.new
# persistent objects which currently have changes detected
# (this collection is now created on the fly each time the property is called)
session.dirty
# persistent objects that have been marked as deleted via session.delete(obj)
session.deleted
# dictionary of all persistent objects, keyed on their
# identity key
session.identity_map
イベント システムを介して、追跡フラッシュ (.new、.dirty、および .deleted がリセットされます) と組み合わせて、session.new
、session.dirty
およびを使用して、コミットされていない変更を追跡できます。詳細については、こちらの会話を参照してください: https://groups.google.com/forum/#!topic/sqlalchemy/eGxpQBChXQwsession.deleted
これは、バッファリングの典型的なケースです。適度に大きなチャンクを試して、ディスク I/O が多すぎる場合 (または長時間の一時停止などの原因となるのが望ましくない場合) に減らすか、プロファイルで I/O 呼び出しの CPU 時間が多すぎると示されている場合はチャンクを増やします。
実装するには、配列を使用し、「書き込み」ごとに項目を配列に追加します。全体を書き込む別の「フラッシュ」関数を用意します。チェックするたびに追加し、最大サイズに達した場合は、それらをすべて書き込み、配列をクリアします。最後に、フラッシュ関数を呼び出して、部分的に満たされた配列を書き込みます。