2016-08-31 6 views
2

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

enter image description here

+1

Siehe [Python-Dokument auf gc] (https://docs.python.org/2/library/gc.html), achten Sie besonders auf Leck und Debug. – YiFei

+0

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. –

+0

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. –

Antwort

0

Leider können Sie nicht viel tun, außer gc.collect() Aufruf plus kann man guten Stil der Praxis übernehmen, wie Sie del verwendet, um die GC zu sagen, dass Sie nicht will es mehr, so wird es gelöscht werden, wenn GC kommen wird und es seine Arbeit tun.

Sie sollten numpy für Container wie Array verwendet werden, die in Bezug auf die Speicherverwaltung effizienter ist