2016-08-31 4 views
2

Для приведенного ниже кода я не могу очистить память, выделенную для переменной «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()) 

и вот профилирование выхода

enter image description here

+1

См [Python документа на дс] (https://docs.python.org/2/library/gc.html), обратите особое внимание на утечку и отладку. – YiFei

+0

Вы проверили 'gc.get_referrers (root)' и 'gc.garbage'? Я бы предположил, что либо первый содержит нечто, отличное от 'f', либо' root' находится в последнем. –

+0

Также ... содержит ли 'file.xml' какие-либо циклические ссылки? Невозможно, чтобы те, которые существовали в XML (хотя парсерам не приходится иметь дело с ними, я не знаю, делает ли это внутреннее представление Python), и сборщик мусора может потенциально испытывать трудности с их очисткой - вам придется разбить петлю вручную. –

ответ

0

К сожалению, вы не можете сделать многое, кроме вызова gc.collect() плюс вы можете принять хороший стиль практики, как вы использовали del сказать GC, что вы не хотите больше, так что он будет удален, когда GC придет и сделает это.

Вы должны использовать numpy для контейнера, как массив, который является более эффективным с точки зрения управления памятью