Can*_*liş 3 python memory dictionary memory-leaks memory-management
看起来垃圾收集器不pop
从dict()
python 2.7中收集值'd (没有尝试python 3).这是一个例子:
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
Run Code Online (Sandbox Code Playgroud)
谁知道为什么会这样,以及如何解决这个内存泄漏问题?
没有内存泄漏问题,因为在不再使用字典时释放内存.字典使用内部表来存储条目.使用时不会释放这些表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
>>>
Run Code Online (Sandbox Code Playgroud)
pop
如果需要,您应该创建新的词典,而不是使用过多的s.