次のようなコードがあります。
def memoryIntensiveFunction(x):
largeTempVariable = Intermediate(x)
processFunction(largeTempVariable,x)
問題は、変数temp
が私のテストケースでは 500 mb のようなものであるということですが、そのスペースmemoryIntensiveFunction
は終了時に OS に返されません。guppy
ツールを使用したメモリ プロファイリングでは、largeTempVariable
解放されている (つまり、Python 内で) と表示されますが、解放されpsutil
ていないことが示されるため、私はこれを知っています。ここに記載されている効果が見られると思います。問題は、このプロセスが長時間 (つまり数時間)memoryIntensiveFunction
実行され、最初に実行され、二度と実行されないことです。そのため、500MB を何時間も持ち歩かなければならないのは不便です。
こことここで見つけた1つの解決策は、別のプロセスを使用することを提案しています。マルチプロセッシングには独自のコストがかかりますが、私の場合はそれだけの価値があります。ただし、これには、呼び出し元がその場で変更されたことを確認するのではなく、戻り値としてmemoryIntensiveFunction
受け取るようにリファクタリングする必要があります。x
本当のキラーは、私のオブジェクトx
が pickle 化できないことです (boost python 拡張機能を多用します)。ピクルスにするのは大変な作業x
です。
検討していないオプションはありますか?