PHP-Entwicklung
Posts 1-6 of 6
-
René Oelke Premium MemberThe company name is only visible to registered members.Große XML-Dateien Ressourcen-schonend verarbeiten
Normalerweise nutze ich SimpleXML bzw. DOMDocument zur Verarbeitung von XML-Dateien. Jedoch hat sich in letzter Zeit herausgestellt, dass der Speicherverbrauch extrem hoch ist, vor allem, wenn man große XML-Dateien verarbeiten will. Hinzu kommt, dass auch die CPU sehr stark beansprucht wird. SimpleXML als auch DOMDocument laden immer die gesamte XML-Datei in den Speicher und bilden dort die XML-Daten mittels Arrays und weiteren Objekten ab.
Ich suche nach einer Möglichkeit, eine XML-Datei "Node-weise" einzulesen und zu verarbeiten. Angenommen wird folgende XML-Struktur:
.<?xml version="1.0" encoding="utf-8"?>
.<products>
.....<product id="1">
.........<name>Produkt 1</name>
.........<description>Produkt 1</description>
.........<category>a</category>
.........<price>1.00</price>
.........<link>
http://www.domain.tld/product/1</link>
.........<images>
.............<image id="1">
.................<url>
http://www.domain.tld/product/1/image/1</url>
.............</image>
.............<image id="2">
.................<url>
http://www.domain.tld/product/1/image/2</url>
.............</image>
.........</images>
.....</product>
.....<product id="2">
.........<name>Produkt 2</name>
.........<description>Produkt 2</description>
.........<category>b</category>
.........<price>2.00</price>
.........<link>
http://www.domain.tld/product/2</link>
.........<images>
.............<image id="1">
.................<url>
http://www.domain.tld/product/2/image/1</url>
.............</image>
.............<image id="2">
.................<url>
http://www.domain.tld/product/2/image/2</url>
.............</image>
.........</images>
.....</product>
.</products>
Immer dann, wenn /products/product (XPath-Notation) auftritt, dann soll eine bestimmte Funktion aufgerufen werden. Als Parameter möglichst der Inhalt von <product>...</product>.
Ist eine der XML-Bibliotheken von PHP in der Lage, XML-Dateien derartig zu verarbeiten?
Danke im Voraus.
PS: Ach ja, Verwendungszweck ist natürlich der Import von XML-Dateien ist eine MySQL-Tabelle (MySQL 5.0), möglichst im Originalzustand (ähnlich einem CSV-Import). Falls es hierfür bereits fertige Bibliotheken gibt, greife ich auch gern darauf zurück. Müssen nicht unbedingt PHP-Bibliotheken sein. Python, Ruby oder auch kompilierte Tools für Shell-Skripte (bash) nehme ich gern. Dir original importierten Daten werden später in einem 2. Schritt aufbereitet, gefiltert und weiter verarbeitet. Dafür kommt dann auf jeden Fall PHP zum Einsatz. ;-)
This post was modified on 27 Sep 2010 at 10:27 pm.- 27 Sep 2010, 10:17 pm
-
Post visible to registered members
-
Post visible to registered members
-
Thomas WeinertThe company name is only visible to registered members.Re^3: Große XML-Dateien Ressourcen-schonend verarbeiten
Neben SAX, kann auch XMLReader genutzt werden um große XML-Dateien seriell zu verarbeiten. Dies ist der etwas "modernere" Ansatz.
http://de.php.net/manual/en/class.xmlreader.php
- 28 Sep 2010, 10:54 am
-
René Oelke Premium MemberThe company name is only visible to registered members.Re^4: Große XML-Dateien Ressourcen-schonend verarbeiten
Mit SAX ist sicherlich der XML Parser (
http://php.net/manual/en/book.xml.php) gemeint. Sieht sehr interessant aus.
XMLReader ist ebenfalls sehr interessant. Auf den ersten Blick einfacher, da man sich die Definition von Handler-Funktionen spart. Ob das eventuell aber auch ein Nachteil ist, kann ich noch nicht abschätzen.
In beiden Varianten muss man immer prüfen, in welchem Node bzw. Element man sich befindet und wann dieses endet. Die Funktionalität zur Verarbeitung eines Elementes inkl. dessen Childs muss man also selbst ergänzen. Das erscheint mir jedoch das geringste Problem. Bleibt nur abzuschätzen, wieviel Ressourcengewinn man dadurch erhält.
Eine wichtige Entscheidung für mich ist noch die der langfristigen Verwendbarkeit einer der beiden Bibliotheken. SAX (XML Parser) scheint es schon länger, demzufolge ist es ausreichend getestet und hoffentlich auch stabil. XMLReader ist moderner, demzufolge jünger. Inwieweit es fehleranfälliger ist, kann ich nicht beurteilen. Ich vermute nicht, dass eine der beiden Bibliotheken irgendwann aus PHP entfernt werden. Sie scheinen fester Bestandteil von PHP zu sein (PHP Core).
Falls noch weitere Anmerkungen zu dem Thema sind, würde ich mich über Feedback freuen.
Danke.
- 28 Sep 2010, 11:46 am
-
Thomas WeinertThe company name is only visible to registered members.Re^5: Große XML-Dateien Ressourcen-schonend verarbeiten
An sich wirst du keine "Ressourcen gewinnen". Du verteilst sie nur anders. XMLReader (und SAX) arbeiten seriell auf dem XML. Dadurch müssen sie nicht den ganzen Baum im Speicher halten. Es ist im Zweifel jedoch mehr Arbeit auf PHP-Ebene, welche sonst von der Library erledigt werden könnte (Xpath).
Potentiell ist das langsamer, konkret müsste/sollte man es testen wenn es wichtig ist.
Die Frage ist, ob überhaupt eine Wahl besteht. Darf dem PHP-Prozess überhaupt so viel Speicher zugewiesen werden, das er die Datei ins DOM laden könnte?
Grundsätzlich würde ich DOM wenn möglich, XMLReader wenn nötig, SAX wenn XMLReader nicht verfügbar, und SimpleXML gar nicht einsetzen.
- 28 Sep 2010, 1:46 pm
