我一直在使用XML资源,似乎Python发布了一种奇怪的行为。我已经测试了lxml库和xml.etree.ElementTree,它们都应该被gc收集后保留内存。我输入gc.collect()作为测试,但没有其他事情发生:内存仍然由进程保持。
进口:
import time
from lxml import etree
import gc
这是代码:
def process_alternative():
"""
This alternative process will use lxml
"""
filename = u"/tmp/randomness.xml"
fd = open(filename, 'r')
tree = etree.parse(fd)
root = tree.getroot()
accum = {}
for _item in root.iter("*"):
for _field in _item.iter("*"):
if _field.tag in accum.keys():
accum[_field.tag] += 1
else:
accum[_field.tag] = 1
for key in accum.keys():
print "%s -> %i" % (key, accum[key])
fd.close()
gc.collect()
这是我的主要
if __name__ == "__main__":
while True:
print "Wake up!"
process_alternative()
print "Sleeping..."
time.sleep(30)
如你所见,这个主要调用“process_alternative”,然后睡觉。提供的XML文件加载内存近800Mb;所以,在time.sleep之前,内存应该被进程释放,返回到所需的基本VM内存(大约32Mb?)。相反,流程继续持有大约800Mb。
关于为什么在每次迭代后都没有释放内存的任何提示?
使用ubuntu 13.04,Python 2.7.4
此函数在每次迭代中释放内存
def check_memory():
ac1 = [a1**5 for a1 in xrange(10000000)]
time.sleep(5)
ac2 = [a1**5 for a1 in xrange(10000000)]
time.sleep(5)
ac3 = [a1**5 for a1 in xrange(10000000)]
答案 0 :(得分:-2)
我不知道为什么,但是进程仍然保留内存,即使我设置了对gc.collect()的显式调用。
经过一段时间的比赛,感谢Martijn Pieters,出现了一个解决方案。致电
len(gc.get_objects())
释放所有被访问的内存,并在不忙时将进程保留在正确的资源上。奇怪,但却是真的。