iterparse
tüm dosya üzerinde bir ağaç oluşturulur ve hiçbir öğe serbest bırakılmaz. Bunu yapmanın avantajı, öğelerin ebeveynlerinin kim olduğunu hatırlaması ve ata öğelerinin öğelerini ifade eden XPath'lar oluşturabilmenizdir. Dezavantajı, çok fazla hafıza tüketebilmesidir.
def fast_iter(context, func, *args, **kwargs):
"""
http://lxml.de/parsing.html#modifying-the-tree
Based on Liza Daly's fast_iter
http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
See also http://effbot.org/zone/element-iterparse.htm
"""
for event, elem in context:
func(elem, *args, **kwargs)
# It's safe to call clear() here because no descendants will be
# accessed
elem.clear()
# Also eliminate now-empty references from the root node to elem
for ancestor in elem.xpath('ancestor-or-self::*'):
while ancestor.getprevious() is not None:
del ancestor.getparent()[0]
del context
sonra böyle kullanabilirsiniz:
def process_element(elem):
print "why does this consume all my memory?"
context = lxml.etree.iterparse('really-big-file.xml', tag='schedule', events = ('end',))
fast_iter(context, process_element)
ederim the article yukarıda fast_iter
üzerinde tavsiye bazı bellek boşaltmak için
ayrıştırmak olarak, Liza Daly en fast_iter
kullanmak dayanır; Büyük XML dosyaları ile uğraşıyorsanız özellikle ilgi çekici olmalıdır.
Yukarıda sunulan fast_iter
, makalede görüntülenen 'un biraz değiştirilmiş bir sürümüdür. Bu bir önceki ataları silmeyle ilgili daha agresiftir, böylece daha fazla bellek tasarrufu sağlar.farkını gösteren Here you'll find a script.
teşekkürler! Hem senin çözümün, hem de yeni eklediğim şey hile yapıyor gibi gözüküyor, ben ve diğer insanların hangisinin daha iyi bir çözüm olduğunu merak ediyorum. Bir fikrin var mı? –
Çözüm çalışmalarınızı kapatır ve http://effbot.org/zone/element-iterparse.htm çözümünü yapmadı (hala tüm belleğimi yedim) –
Teşekkür ederiz! Bu gerçekten işe yarayan bir versiyon. Liza Daly, effbot ve lxml resmi dokümanlarından versiyonlar benim için çok fazla bellek tasarrufu yapmadı. – fjsj