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.