私は、メモリ消費量が時間とともに着実に増加するPythonコードを持っています。合法的にかなり大きくなる可能性のあるオブジェクトがいくつかありますが、私が観察しているメモリフットプリントがこれらのオブジェクトによるものなのか、それとも適切に廃棄されない一時的なものでメモリを散らかしているだけなのかを理解しようとしています。 ---手動メモリ管理の世界からの最近の変換であるため、Pythonランタイムが一時オブジェクトを処理する方法のいくつかの非常に基本的な側面を正確に理解していないと思います。
大まかにこの一般的な構造のコードを考えてみましょう(無関係な詳細は省略しています)。
def tweak_list(lst):
new_lst = copy.deepcopy(lst)
if numpy.random.rand() > 0.5:
new_lst[0] += 1 # in real code, the operation is a little more sensible :-)
return new_lst
else:
return lst
lst = [1, 2, 3]
cache = {}
# main loop
for step in xrange(some_large_number):
lst = tweak_list(lst) # <<-----(1)
# do something with lst here, cut out for clarity
cache[tuple(lst)] = 42 # <<-----(2)
if step%chunk_size == 0:
# dump the cache dict to a DB, free the memory (?)
cache = {} # <<-----(3)
質問:
new_list
で作成されたの寿命はtweak_list
どれくらいですか?出口で破棄されますか、それともガベージコレクションされますか(その時点で?)。tweak_list
何億もの小さなリストを生成するための繰り返しの呼び出しは、長い間残っていますか?- キーとして使用するため
list
にaをに変換するときに一時的な作成はありますか?tuple
dict
dict
を空に設定すると、メモリが解放されますか?- それとも、私は完全に間違った視点から目前の問題に取り組んでいますか?