私はそれぞれ0.5GBのピクルファイルを50個持っています。 各ピクルファイルは、カスタムクラスオブジェクトのリストで構成されています。私は繰り返し、私はメモリリークを取得したファイル をロードしようとすると、しかしforループで大規模なpickleファイルを読み込むと、メモリリークを防ぐ方法を教えてください。
def loadPickle(fp):
with open(fp, 'rb') as fh:
listOfObj = pickle.load(fh)
return listOfObj
: は、私は何の問題 次の関数を使用して、個別にファイルをロードしていません。
l = ['filepath1', 'filepath2', 'filepath3', 'filepath4']
for fp in l:
x = loadPickle(fp)
print('loaded {0}'.format(fp))
loaded filepath2
が印刷される前にメモリがオーバーフローしました。 各反復中にピクルが1つだけロードされることを保証するコードを作成するにはどうすればよいですか?
weakref
モジュールで定義されたオブジェクトや、gc
モジュールを使用した明示的なガベージコレクションを使用することを推奨しますが、これらのメソッドを特定のユースケースにどのように適用するのかを理解するのは困難です。これは、私がフードの中でどのように参照が機能するかについての理解が不十分なためです。
'の後ろに' x = None'をつけてみましょう。 –
こんにちはIonut Hulub、ありがとう。出来た! –
実際のメモリリークはありません。新しい値が割り当てられるまで古い 'x'値を解放することはできないので、一度に2つの値をメモリに格納するだけのメモリが必要です。 – abarnert