Für den folgenden Code kann ich nicht den Speicher für 'Root' Variable evan nach 'del root' und gc.collect() zugeordnet löschen. Ich verstehe, dass die Garbage Collection in Python automatisch beendet wird. Gibt es eine Möglichkeit, es mehr zu klären?Garbage Collection in 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())
und hier ist Profilierungs Ausgang
Siehe [Python-Dokument auf gc] (https://docs.python.org/2/library/gc.html), achten Sie besonders auf Leck und Debug. – YiFei
Haben Sie 'gc.get_referrers (root)' und 'gc.garbage' überprüft? Ich würde vermuten, dass entweder die erste etwas anderes als "f" enthält, oder dass "root" in letzterer ist. –
Außerdem ... enthält 'file.xml' zyklische Referenzen? Es ist nicht unmöglich, dass diese in XML existieren (obwohl Parser nicht mit ihnen umgehen müssen, ich weiß nicht, ob die interne Darstellung von Python dies tut), und der Garbage Collector kann möglicherweise Schwierigkeiten haben, diese zu bereinigen - du müsstest Brechen Sie die Schleife manuell. –