2016-06-02 6 views
2

ガベージコレクタのように、popdict()のpython 2.7(python 3では試していません)の値を収集していないようです。ここに例があります:dict popはメモリを解放していません

a = dict() 

# fill the memory (dict) 
for i in xrange(0, 9999999): 
    a[i] = i 

# Memory usage is about 600 MB 
# try to free the memory 
for i in xrange(0, 9999999): 
    a.pop(i) 

# print the dict and see it is empty 
print "%r" % a 
# prints: {} 
# Memory usage is about 600 MB 

import copy 
a = copy.copy(a) 
# Memory usage decreased to about 200 MB 

import gc 
gc.collect() 
# Memory usage decreased to about 10 MB  

誰もがこのようなことが起こり、このメモリリークの問題を解決する方法を知っていますか?

+0

どのようにメモリ使用量を測定しましたか? – Daniel

+0

'top'コマンドを使用 –

+0

なぜ' del'ではなく 'pop'を使うのですか? –

答えて

4

辞書が使用されなくなったときにメモリが解放されるため、メモリリークの問題はありません。ディクショナリは内部テーブルを使用してエントリを格納します。 popを使用すると、これらのテーブルは解放されません。すべてのキーが内部テーブルのハッシュモジュロサイズにマップされるからです。したがって、最後の既存のキーはこのテーブルの最後にある可能性があります。これを説明するために

、私はsys.getsizeofを使用します:

>>> a= {} 
>>> sys.getsizeof(a) 
288 
>>> for i in range(9999999): a[i]=i 
... 
>>> sys.getsizeof(a) 
402653280 
>>> for i in range(9999999): del a[i] 
... 
>>> sys.getsizeof(a) 
402653280 
>>> a = copy.copy(a) 
>>> sys.getsizeof(a) 
288 
>>> 

代わりに過度pop Sを使用する必要があれば、あなたは新しい辞書を作成する必要があります。

+0

この実験を 'a = []'と 'a.pop()'というリストで繰り返しましたが、その場合はメモリを解放するように見えますが、それは正しいでしょうか? – pinhead

関連する問題