私はPythonで大きな階層データセットを持っています。私はそれを終えた後、私はそれを取り除く必要がある - 私はdel
を階層のルートノードで行うだけです。通常のPythonガベージコレクションプロセスに干渉するべきでしょうか?
gc.collect()
を手作業で実行しても問題ありません。大量のデータをすばやく削除するのは良い方法ですか、そうしないといいですか?
gc
を手動で使用する正しいパターンは何ですか?
私はPythonで大きな階層データセットを持っています。私はそれを終えた後、私はそれを取り除く必要がある - 私はdel
を階層のルートノードで行うだけです。通常のPythonガベージコレクションプロセスに干渉するべきでしょうか?
gc.collect()
を手作業で実行しても問題ありません。大量のデータをすばやく削除するのは良い方法ですか、そうしないといいですか?
gc
を手動で使用する正しいパターンは何ですか?
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
はCPythonのごみが、それは常に、実際にない何かを収集するとき:最後の機能は、それが返す使用する際に、データ構造への最後の参照が簡単に消えるということは、このような方法であなたの機能を設定するにははるかにエレガントですそのメモリをオペレーティングシステムに戻します。
Pythonは複雑なメモリシステム「アリーナ」と「プール」を使用しています(たとえばhttp://www.evanjones.ca/memoryallocator/を参照)。オブジェクトはそれらのプールおよびアリーナに存在し、メモリ全体がガベージコレクションされたときにのみメモリがOSに戻されます。
これは、最悪の場合、250MBのメモリを占有する1000個のオブジェクトが存在する可能性があることを意味します。これでPythonはメモリをかなり賢い方法で割り当てます。したがって、この最悪の場合(ほとんど)は決して起こりません。
非常に異なるサイズのオブジェクトを常に割り当てたり割り当てを解除したりすると、これらのメモリの断片化の問題が発生する可能性があります。その場合、PythonはOSに多くのメモリを返さないため、悲しいことにそれについて多くのことを行うことはできません。
私は、通常のアドバイスはGC /参照カウントをそのまま残しておくことですが、C++から来て、直感的には、思う。 –