Для приведенного ниже кода я не могу очистить память, выделенную для переменной «root» evan после «del root» и gc.collect(). Я понимаю, что в python сбор мусора автоматически выпускается. Есть ли способ очистить его больше?сбор мусора в python
from __future__ import with_statement
import os
import sys
from memory_profiler import profile
import gc
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
def f():
with open('file.xml') as f:
output_xml_str = f.read()
root = ET.fromstring(output_xml_str)
del root
@profile
def main():
x = {}
for i in xrange(10000):
x[i] = i+1
del x
f()
for i in range(12):
gc.collect()
if __name__ == "__main__":
sys.exit(main())
и вот профилирование выхода
См [Python документа на дс] (https://docs.python.org/2/library/gc.html), обратите особое внимание на утечку и отладку. – YiFei
Вы проверили 'gc.get_referrers (root)' и 'gc.garbage'? Я бы предположил, что либо первый содержит нечто, отличное от 'f', либо' root' находится в последнем. –
Также ... содержит ли 'file.xml' какие-либо циклические ссылки? Невозможно, чтобы те, которые существовали в XML (хотя парсерам не приходится иметь дело с ними, я не знаю, делает ли это внутреннее представление Python), и сборщик мусора может потенциально испытывать трудности с их очисткой - вам придется разбить петлю вручную. –