我正在与Python项目中的内存泄漏作斗争并且已经花了很多时间在它上面。我把这个问题推到了一个小例子。现在看来我知道解决方案,但我无法理解为什么。
import random
def main():
d = {}
used_keys = []
n = 0
while True:
# choose a key unique enough among used previously
key = random.randint(0, 2 ** 60)
d[key] = 1234 # the value doesn't matter
used_keys.append(key)
n += 1
if n % 1000 == 0:
# clean up every 1000 iterations
print 'thousand'
for key in used_keys:
del d[key]
used_keys[:] = []
#used_keys = []
if __name__ == '__main__':
main()
我的想法是在dict d
中存储一些值并记住列表中使用的键,以便能够不时清理字典。
程序的这种变化充满信心地让记忆永远不会回来。如果我使用替代方法“清除”示例中注释的used_keys
,一切都很好:内存消耗保持在恒定水平。
为什么?
在CPython和许多linux上测试过。
答案 0 :(得分:5)
这就是原因 - 当前方法不会从dict中删除键(实际上只有一个)。这是因为您在循环期间清除used_keys
列表,并且循环过早退出。
然而,第二个(注释)方法在为used_keys
分配新值时起作用,因此循环成功完成。
看到之间的区别:
>>> a=[1,2,3]
>>> for x in a:
... print x
... a=[]
...
1
2
3
和
>>> a=[1,2,3]
>>> for x in a:
... print x
... a[:] = []
...
1
>>>
答案 1 :(得分:0)
为什么这样的事情不起作用?
from itertools import count
import uuid
def main():
d = {}
for n in count(1):
# choose a key unique enough among used previously
key = uuid.uuid1()
d[key] = 1234 # the value doesn't matter
if n % 1000 == 0:
# clean up every 1000 iterations
print 'thousand'
d.clear()
if __name__ == '__main__':
main()