Dlaczego elementtree.ElementTree.iterparse używa tak dużo pamięci?

Używam elementtree.ElementTree.iterparse do analizowania dużego (371 MB) pliku xml.

Mój kod jest w zasadzie taki:

outf = open('out.txt', 'w') 
context = iterparse('copyright.xml')
context = iter(context)
dummy, root = context.next()

for event, elem in context:
    if elem.tag == 'foo':
        author = elem.text

    elif elem.tag == 'bar':
        if elem.text is not None and 'bat' in elem.text.lower():
            outf.write(elem.text + '\n')
    elem.clear()   #line A
    root.clear()   #line B

Moje pytanie jest dwojakie:

Po pierwsze - czy potrzebuję zarówno A, jak i B (patrz komentarze do kodu)? Powiedziano mi, że root.clear () czyści niepotrzebne dzieci, więc pamięć nie jest pochłonięta, ale oto moje obserwacje: użycie B, a nie A, jest takie samo, jak użycie ani pod względem zużycia pamięci (wykreślone za pomocą menedżera zadań). Używanie tylko A wydaje się być takie samo jak używanie obu.

Po drugie - dlaczego to wciąż pochłania tak dużo pamięci? W trakcie działania program wykorzystuje około 100 MB pamięci RAM pod koniec.

Zakładam, że ma to coś wspólnego z outf, ale dlaczego? Czy to nie tylko zapis na dysk? A jeśli przechowuje te dane przed zamknięciem, jak mogę tego uniknąć?

Inne informacje: Używam Pythona 2.7.3 w systemie Windows.

questionAnswers(2)

yourAnswerToTheQuestion