Seite 1 von 1
Speicherverbrauch beim Parsen von XML
Verfasst: Freitag 17. Oktober 2008, 20:26
von __marcus__
Code: Alles auswählen
from xml.dom import minidom
#data = minidom.parse('file.xml')
while True:
pass
Wenn ich dieses Script so laufen lasse, belegt der Python-Prozess 2.33 mb physikalischen Speicher. Ist die 2te Zeile hingegen nicht auskommentiert sind es 3.78.
Ist das normal, 1.45 mb mehr durch das Parsen einer 17 kb-XML-Datei? (Ich hatte versucht 40 mb zu parsen, das ging überhaupt nicht...)
Verfasst: Freitag 17. Oktober 2008, 20:32
von Leonidas
Naja, Minidom baut ja auch einen ziemlich großen Baum. Für größere Sachen eignet sich auf jeden Fall lxml wesentlich besser.
Verfasst: Freitag 17. Oktober 2008, 21:23
von lunar
Dazu auch
Python HTML Parser Performance. Das ist zwar nicht direkt themenbezogen, zeigt aber zwei Dinge sehr schön: Minidom sucks, und lxml rocks
Ganz generell würde ich XML wenn möglich
immer mit lxml verarbeiten. Es ist schnell, speicherschonend und hat eine angenehme API.
Verfasst: Freitag 17. Oktober 2008, 21:43
von cofi
Wenns möglichst portabel sein soll, kann man auch auf ElementTree - Standardlibrary oder
http://effbot.org/zone/element-index.htm - zurückgreifen.
Aber wenn das nicht nötig ist, dann ist lxml.etree die bessere Wahl - auch wenn die API großteils gleich ist.
Hier gibts noch ein paar Benchmarks zu lxml:
http://codespeak.net/lxml/performance.html
Verfasst: Samstag 18. Oktober 2008, 17:27
von __marcus__
lunar hat geschrieben:Minidom sucks, und lxml rocks
Ich habe es jetzt mit
Code: Alles auswählen
from xml.sax import make_parser, handler
class MParser(handler.ContentHandler):
def startElement(self, name, attrs):
def endElement(self, name):
gemacht und läuft wie 'ne eins.
Verfasst: Samstag 18. Oktober 2008, 18:02
von lunar
Minidom mit SAX zu ersetzen, ist imho krank.
Verfasst: Samstag 18. Oktober 2008, 18:15
von Leonidas
lunar hat geschrieben:Minidom mit SAX zu ersetzen, ist imho krank.
Für richtig große Dateien, die man nur durchlaufen will ohne sie irgendwie umfassend zu analysieren ist SAX durchaus nützlich. Eine andere Frage ist natürlich, ob es sich bei dem OP um genau so einen Fall handelt.
Verfasst: Samstag 18. Oktober 2008, 18:33
von lunar
Leonidas hat geschrieben:lunar hat geschrieben:Minidom mit SAX zu ersetzen, ist imho krank.
Für richtig große Dateien, die man nur durchlaufen will ohne sie irgendwie umfassend zu analysieren ist SAX durchaus nützlich.
Naja, lxml.iterparse existiert
Eine andere Frage ist natürlich, ob es sich bei dem OP um genau so einen Fall handelt.
Wohl eher nicht ... immerhin wollte der OP minidom einsetzen
Verfasst: Samstag 18. Oktober 2008, 18:55
von __marcus__
lunar hat geschrieben:Minidom mit SAX zu ersetzen, ist imho krank.
Hier war halt Minidom krank und SAX die Medizin.
Verfasst: Samstag 18. Oktober 2008, 19:06
von Leonidas
__marcus__ hat geschrieben:Hier war halt Minidom krank und SAX die Medizin.
Operation gelungen, Patient tot.
SCNR
@lunar: iterparse kannte ich nicht, danke. Werds mir Beizeiten ansehen.