2012-03-19 10 views
3

私はPythonで大きな階層データセットを持っています。私はそれを終えた後、私はそれを取り除く必要がある - 私はdelを階層のルートノードで行うだけです。通常のPythonガベージコレクションプロセスに干渉するべきでしょうか?

gc.collect()を手作業で実行しても問題ありません。大量のデータをすばやく削除するのは良い方法ですか、そうしないといいですか?

gcを手動で使用する正しいパターンは何ですか?

+0

私は、通常のアドバイスはGC /参照カウントをそのまま残しておくことですが、C++から来て、直感的には、思う。 –

答えて

3

CPythonのガベージコレクタは依然として参照カウントに基づいているため、データ構造が本当に階層構造(循環参照を含まない)の場合は、最後のリファレンスでdelがメモリからクリアする必要があります。 gcモジュールを使用してください。

つまり、delを使用しないことをお勧めします。

def load(): 
    return some_huge_data_structure 

def process(ds): 
    do_whatever_to(ds) 

process(load()) # after this, the huge DS will be gone 
+0

私は循環参考文献を持っていません。しかし、もし私がそれらを持っていたら、 'gc'を実行する必要があると言っていますか? – treecoder

+0

私は実際にサーバーを書いています。データは要求を超えて保持されているので、 'del'を使うことはできません。 – treecoder

+1

python gcは循環参考文献にのみ使用されます。参照カウントによって残りの部分が処理されます。 –

1

はCPythonのごみが、それは常に、実際にない何かを収集するとき:最後の機能は、それが返す使用する際に、データ構造への最後の参照が簡単に消えるということは、このような方法であなたの機能を設定するにははるかにエレガントですそのメモリをオペレーティングシステムに戻します。

Pythonは複雑なメモリシステム「アリーナ」と「プール」を使用しています(たとえばhttp://www.evanjones.ca/memoryallocator/を参照)。オブジェクトはそれらのプールおよびアリーナに存在し、メモリ全体がガベージコレクションされたときにのみメモリがOSに戻されます。

これは、最悪の場合、250MBのメモリを占有する1000個のオブジェクトが存在する可能性があることを意味します。これでPythonはメモリをかなり賢い方法で割り当てます。したがって、この最悪の場合(ほとんど)は決して起こりません。

非常に異なるサイズのオブジェクトを常に割り当てたり割り当てを解除したりすると、これらのメモリの断片化の問題が発生する可能性があります。その場合、PythonはOSに多くのメモリを返さないため、悲しいことにそれについて多くのことを行うことはできません。

関連する問題