【问题标题】:dict pop does not free the memorydict pop 不会释放内存
【发布时间】:2016-10-01 18:45:05
【问题描述】:

看起来垃圾收集器没有从 python 2.7 中的dict() 收集值pop'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    

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

【问题讨论】:

  • 你是如何测量内存使用的?
  • 使用top 命令
  • 为什么使用pop 而不是del
  • @ivanK。 del 的行为也相同。
  • top 没有提供准确的数字,因为内存块不会立即释放。

标签: python dictionary memory memory-management memory-leaks


【解决方案1】:

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

【讨论】:

  • 我用列表 a=[]a.pop() 重复了这个实验,看起来在这种情况下它确实释放了内存,听起来对吗?
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多