看起来垃圾收集器没有从Python2.7中的pop中收集值dict()'d(没有在Python3上尝试)。下面是一个例子:

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

有人知道为什么会发生这种情况以及如何解决内存泄漏问题吗?

最佳答案

没有内存泄漏问题,因为当字典不再使用时,内存被释放字典使用内部表来存储条目。使用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
>>>

如果需要,您应该创建新的词典,而不是使用过多的pops。

10-07 19:49
查看更多