große XML häppchenweise einlesen

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Kann man mit Python eine große XML-Datei häppchenweise einlesen? Ich denke mir sowas:

Code: Alles auswählen

<?xml version="1.0"?>
<root>
	<meta>
		<!-- small data -->
	</meta>
	<info>
		<!-- small data -->
	</info>
	<content>
		<!-- BIG data -->
	</content>
</root>
Ich brauche aus dem XML nur die Elemente <meta> und <info>, nicht aber den Rest. Kann man recht zügig und ohne die gesamte XML-Datei einlesen zu müssen nur die ersten Elemente einlesen?
BlackJack

Mit einem SAX-Parser nur <meta> und <info> verarbeiten, bzw. `ElementTree.iterparse()` verwenden.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Welchen Parser verwendet Python standardmäßig? Ich dachte das wäre Expat... Da ich gern was plattformübergreifendes hätte, klingt die `ElementTree`-Geschichte erstmal gut. Wie löst denn `ElementTree.iterparse()` das Problem? Wird nicht trotzdem erstmal die gesamte Datei eingelesen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Welchen Parser verwendet Python standardmäßig? Ich dachte das wäre Expat... Da ich gern was plattformübergreifendes hätte
Und Expat ist etwa nicht platformunabhängig? Wenn du SAX nutzt, kann dir der Parser mehr oder weniger egal sein, SAX ist sowieso überall gleich (unangenehm).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Leonidas hat geschrieben:Und Expat ist etwa nicht platformunabhängig? Wenn du SAX nutzt, kann dir der Parser mehr oder weniger egal sein, SAX ist sowieso überall gleich (unangenehm).
Klar ist Expat plattformabhängig, aber ich dachte in Python "eingebaut". Hab das so verstanden, dass Python für SAX nur eine Schnittstelle bietet. Aber ich gebe zu, dass es etwas unübersichtlich ist…

Wer weiß mehr? Kommen Expat bzw. SAX mit Python mit?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Schau in die Doku. python.org/doc
Da steht das alles, wirklich!
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

xml.parsers.expat hat geschrieben:The xml.parsers.expat module is a Python interface to the Expat non-validating XML parser. […] This module uses the pyexpat module to provide access to the Expat parser.
D.h. das pyexpat Modul muss separat installiert werden (es wird nicht im Global Module Index aufgelistet)?
xml.sax hat geschrieben:The xml.sax package provides a number of modules which implement the Simple API for XML (SAX) interface for Python. The package itself provides the SAX exceptions and the convenience functions which will be most used by users of the SAX API.
SAX kenne ich nur in Verbindung mit fertigen SAX-Parsern. Frage: liefert Python einen mit? Oder ist das xml.sax Modul bereits alles, was ich benötige?
BlackJack

Ja Python liefert einen SAX-Parser.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Von Haus aus für jede Plattform oder muss da ein Extra-Modul installiert werden?

Mit TkInter ist das ja ähnlich: unter Windows ist das von Haus aus dabei, unter Linux muss das aber u.U. erst nachinstalliert werden, aber es gehört wenigstens zur Standard-Distribution. Daher meine Unsicherheit...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:
Leonidas hat geschrieben:Und Expat ist etwa nicht platformunabhängig? Wenn du SAX nutzt, kann dir der Parser mehr oder weniger egal sein, SAX ist sowieso überall gleich (unangenehm).
Klar ist Expat plattformabhängig, aber ich dachte in Python "eingebaut". Hab das so verstanden, dass Python für SAX nur eine Schnittstelle bietet. Aber ich gebe zu, dass es etwas unübersichtlich ist…
Ist es doch. Alles was im Global Module Index dukumentiert ist, ist in der Stdlib. Ich sehe dein Problem nicht.

Expat kannst du zwar direkt nutzen, aber du kannst genauso gut auch die "höheren" APIs SAX und Minidom oder ElementTree verwenden (ich würde ja zu ET, aber mindestens zu DOM raten, weil SAX echt PITA ist). Wenn es schnell gehen soll, dann ist sowieso lxml die erste Wahl, wie der aktuelle Geschwindigkeitsvergleich von Ian Bicking zeigte.

Und wie das Python-Paket auf Linux aufgeteilt wird, ist nicht definiert. Die Distributionen können das Paket splitten wie sie wollen, sie können auch Teile (etwa den Profiler) weglassen. Aber es macht keinen sinn, wegen solchen Überlegungen auf einen Parser in der Stdlib zu verzichten. Unter Windows kann ich auch entscheiden Tkinter nicht zu installieren, also ist es nicht von Haus aus dabei.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@Leonidas: Das XML soll nicht ganz verarbeitet werden, sondern nur ein verhältnismässig kleiner Teil am Anfang. Damit fällt DOM im Grunde raus.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:@Leonidas: Das XML soll nicht ganz verarbeitet werden, sondern nur ein verhältnismässig kleiner Teil am Anfang. Damit fällt DOM im Grunde raus.
Hmm, wieso? Solange das XML-Dokument nicht zu groß ist, kann man es doch problemlos einlesen. Wenn es tatsächlich zu langsam wird, kann man sich immer noch was überlegen. Es ist schon möglich, dass hier ein Fall von Premature Optimization vorliegt. Ist DOM tatsächlich ein Performance-Problem oder nur ein geschätztes Problem?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich bin halt davon ausgegangen, dass der Kommentar in Zeile 10 im ersten Beitrag ernst gemeint war.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Ich bin halt davon ausgegangen, dass der Kommentar in Zeile 10 im ersten Beitrag ernst gemeint war.
BIG data kann ja alles mögliche meinen. Es kann ja immer noch klein genug sein, so dass man es mit dem kompletten Parsen angehen kann. Sowas muss man eben ausprobieren. Bevor ich zu SAX greifen würde, tät ich wirklich erst nachsehen ob es wirklich ein ausreichend großes Problem ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Na, gehen wir mal davon aus, dass in <!-- BIG data --> wirklich zu große Daten stehen, also nehmen wir ruhig 10.000 bis 50.000 Zeilen an.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Na, gehen wir mal davon aus, dass in <!-- BIG data --> wirklich zu große Daten stehen, also nehmen wir ruhig 10.000 bis 50.000 Zeilen an.
Und, ist es mit Minidom zu langsam für dich?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Nun ja, die Geschwindigkeit hab ich noch gar nicht gemessen, nur gefühlt dauert das schon sehr lange. Aber den Speicherverbrauch hab ich gemessen, und der explodiert mit minidom gewaltig. Eine XML-Datei mit gut 20.000 Zeichen ist so um die 1,5 MB groß. Beim Einlesen werden ca. 90 MB Arbeitsspeicher benötigt. Das ist recht heftig.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ok, das ist nun endlich mal etwas handfestes. Also kannst du mal das mit SAX implementieren und gucken, wie es im Vergleich dazu abschneidet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
rezeptor
User
Beiträge: 8
Registriert: Dienstag 6. November 2007, 23:02

Ich würde zu ElementTree greifen. Das Modul benutzt ja wie bereits gesagt Expat und da dieser stream-orientiert arbeitet, kannst du dir ElementTree ableiten und in die Feed-Methode entsprechende Funktionalitäten zur steuerung der zu parsenden Datenmenge einbauen. (Also bevor du den eigentlichen Feed-Call zur Basisklasse machst.)
hast du python in der tasche,hast du immer was zum nasche...
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

@rezeptor: Hmm... das klingt ja nett, aber wie soll man das denn anstellen? Haettest du da ein kurzes Beispiel?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten