4

いくつかの ZODB チュートリアルを読みましたが、まだ得られないことが 1 つあります。(たとえば) FileStorage に既にシリアル化 (およびコミット) されているメモリを解放するにはどうすればよいですか?

より具体的には、次のコードがすべてのメモリを消費するのをやめさせたい:

for i in xrange(bignumber):
    iobtree[i]=Bigobject() # Bigobject is about 1Mb
    if(i%10==0): 
        transaction.commit() # or savepoint(True)
transaction.commit()

これはどのように達成できますか?iobtree によって保存された参照を解放し、オンデマンドでアクセスできる「弱い参照」に置き換えることは可能ですか?

4

1 に答える 1

6

セーブポイントを作成してトランザクションをコミットすると、すでに多くのメモリがクリアされます。

  • ZODB キャッシュ パラメータの設定を確認し、必要に応じて調整する必要があります。キャッシュ サイズ パラメーターは、バイト数ではなく、キャッシュされたオブジェクトの数を示すため、オブジェクトのサイズに基づいてこれを調整する必要があります。

  • ZODB 接続オブジェクトを試して呼び出すことができ.cacheMinimize()ます。これにより、キャッシュ内の変更されていない (または既にコミットされている) オブジェクトが明示的に非アクティブ化されます。

それ以外では、Python がメモリからオブジェクトを解放した場合でも、OS は解放されたメモリが別の目的で必要になるまで常に再利用するとは限らないことに注意してください。OS が報告するメモリ使用量は、Python プロセスの実際のメモリ要件を必ずしも反映しているわけではありません。

于 2012-11-19T19:12:05.697 に答える