Zum Performancevergleich wurde mit einem Subset von 350 Elementen gearbeitet.
Test 1: Java, XML, DOM, Xpath, 350 Elemente in Datei
- Laufzeit pro Element: 20ms
- Verhältnis XML Parsen/DB Speichern: 25, das XML Verarbeiten verbraucht primär die Zeit
- Geschätzte Gesamtlaufzeit: 33 min
Test 2: Java, XML, DOM, Jaxen 1.2 Xpath, 350 Elemente in Datei
- Laufzeit pro Element: 3ms
- Verhältnis XML Parsen/DB Speichern: 15, das XML Verarbeiten verbraucht primär die Zeit
- Geschätzte Gesamtlaufzeit: 5 min
- Jaxen Xpath ist deutlich schneller als das normale Java Xpath
Beide Tests waren erfolgreich. Jetzt der Test mit voller Datenmenge.
Test 3: Java, XML, DOM, Jaxen 1.2 Xpath, 100T Elemente in Datei
- Manueller Abbruch des Test, weil die Laufzeit unglaublich schlecht war.
Test 3: Java, XML, DOM, Xpath, 100T Elemente in Datei
- Manueller Abbruch des Test, weil die Laufzeit unglaublich schlecht war.
- Performance ist aber besser als Jaxen.
- Bei einer Detailanalyse sieht man das die Laufzeit für die XPath Evaluierung nach oben schnellen, das obwohl ausreichen RAM (XMX) vorhanden ist. Der Schluss daraus ist, das die Auswertung von XPath ausdrücken eine hohe Komplexität hat, es werden scheinbar Listen durchlaufen. Übertragen auf relationale DBs, XPath Evaluierung entsprechen sequential Scans. Java XPath kann also nicht die Element-Adresse im Speicher berechnen, sondern muss sie suchen, indem (mehrere) Listen sequentiell durchlaufen werden.
Zusammenfassung
- Die Verarbeitung grosser XML Dateien mittels DOM und XPath ist ineffizient. Das gilt wahrscheinlich auch für andere DOM basieret Formate wie JSON.
- Jaxen XPath ist deutlich schneller als Java XML XPath für kleine und normale DOMs.
- Lösungen:
- Alternativen wäre Streaming XML via SAX oder StAX.
- Wechsel von XML zu CSV.
Keine Kommentare:
Kommentar veröffentlichen