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.