Isa*_*aac 6 python garbage-collection
我一直在使用XML资源,并且似乎Python正在发出奇怪的行为。我已经测试了lxml库和库xml.etree.ElementTree,两者都应在收集内存之后才由gc。我输入gc.collect()了一个测试,但没有其他反应:内存仍由进程保留。
进口:
import time
from lxml import etree
import gc
Run Code Online (Sandbox Code Playgroud)
这是代码:
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()
Run Code Online (Sandbox Code Playgroud)
这是我的主要
if __name__ == "__main__":
while True:
print "Wake up!"
process_alternative()
print "Sleeping..."
time.sleep(30)
Run Code Online (Sandbox Code Playgroud)
如您所见,此主体调用“ 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)]
Run Code Online (Sandbox Code Playgroud)
Isa*_*aac -5
我不知道为什么,但即使我设置了对 gc.collect() 的显式调用,进程仍然保留内存。
经过一番尝试后,多亏了 Martijn Pieters,一个解决方案出现了。呼唤
len(gc.get_objects())
Run Code Online (Sandbox Code Playgroud)
释放所有访问的内存,并在进程不忙时将其保留在正确的资源上。奇怪,但却是事实。