0

大量のデータを解析するアプリケーションを開発しましたが、すべてのデータを解析した後にデータをコミットすると、メモリを消費しすぎます。ただし、ハード ディスク I/O のコストがかかりすぎるため、毎回コミットすることはできません。

したがって、私の質問は、セッション内にコミットされていないアイテムがいくつあるかをどのように知ることができますか?

4

3 に答える 3

2

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
于 2012-12-17T08:35:49.957 に答える
2

イベント システムを介して、追跡フラッシュ (.new、.dirty、および .deleted がリセットされます) と組み合わせてsession.newsession.dirtyおよびを使用して、コミットされていない変更を追跡できます。詳細については、こちらの会話を参照してください: https://groups.google.com/forum/#!topic/sqlalchemy/eGxpQBChXQwsession.deleted

于 2014-10-14T21:21:28.413 に答える
0

これは、バッファリングの典型的なケースです。適度に大きなチャンクを試して、ディスク I/O が多すぎる場合 (または長時間の一時停止などの原因となるのが望ましくない場合) に減らすか、プロファイルで I/O 呼び出しの CPU 時間が多すぎると示されている場合はチャンクを増やします。

実装するには、配列を使用し、「書き込み」ごとに項目を配列に追加します。全体を書き込む別の「フラッシュ」関数を用意します。チェックするたびに追加し、最大サイズに達した場合は、それらをすべて書き込み、配列をクリアします。最後に、フラッシュ関数を呼び出して、部分的に満たされた配列を書き込みます。

于 2012-12-17T08:46:03.150 に答える