Speicherverbrauch beim Parsen von XML

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Freitag 17. Oktober 2008, 20:26

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...)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 17. Oktober 2008, 20:32

Naja, Minidom baut ja auch einen ziemlich großen Baum. Für größere Sachen eignet sich auf jeden Fall lxml wesentlich besser.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Freitag 17. Oktober 2008, 21:23

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.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Freitag 17. Oktober 2008, 21:43

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
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Samstag 18. Oktober 2008, 17:27

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.
lunar

Samstag 18. Oktober 2008, 18:02

Minidom mit SAX zu ersetzen, ist imho krank.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 18. Oktober 2008, 18:15

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Samstag 18. Oktober 2008, 18:33

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 ;)
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Samstag 18. Oktober 2008, 18:55

lunar hat geschrieben:Minidom mit SAX zu ersetzen, ist imho krank.
Hier war halt Minidom krank und SAX die Medizin.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 18. Oktober 2008, 19:06

__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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten