Samstag, 10. August 2019

Programmiersprachen die ich gelernt oder benutzt habe

Programmiersprachen die ich gelernt oder benutzt habe:
  1. Assembler
  2. BASIC
  3. BASH
  4. C
  5. Go
  6. Groovy
  7. JavaScript
  8. Java
  9. Lingo
  10. MS-DOS Scripting
  11. Objevtive-C
  12. Pascal
  13. Pearl
  14. Python
  15. R
  16. Ruby
  17. SAS
  18. Scala
  19. SPS
Programmiersprachen die ich extrem gut beherrsche:
  1. Java
  2. BASH
  3. R
Programmiersprachen die gerne probieren würde:
  1. GO

Dienstag, 6. August 2019

Java, XML und Performance

XML ist ein populäres Datenformat für den Datenaustausch zwischen Systemen. Der Vorteil von XML ist, es gibt sehr stabile Parser. Aber wie sieht es mit der Performance aus? Folgende Aufgabe: Einlesen einer XML Datei mit 100T Elementen,  die einige Unterelemete besitzt, die Tiefe ist 4, Dateigrösse 60Mb, Java 8.

Zum Performancevergleich wurde mit einem Subset von 350 Elementen gearbeitet.

Test 1: Java, XML, DOM, Xpath, 350 Elemente in Datei

  1. Laufzeit pro Element: 20ms
  2. Verhältnis XML Parsen/DB Speichern: 25, das XML Verarbeiten verbraucht primär die Zeit
  3. Geschätzte Gesamtlaufzeit: 33 min


Test 2: Java, XML, DOM,  Jaxen 1.2 Xpath, 350 Elemente in Datei

  1. Laufzeit pro Element: 3ms
  2. Verhältnis XML Parsen/DB Speichern: 15, das XML Verarbeiten verbraucht primär die Zeit
  3. Geschätzte Gesamtlaufzeit: 5 min
  4. 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
  1. Manueller Abbruch des Test, weil die Laufzeit unglaublich schlecht war.
Test 3: Java, XML, DOM,  Xpath, 100T Elemente in Datei
  1. Manueller Abbruch des Test, weil die Laufzeit unglaublich schlecht war.
  2. Performance ist aber besser als Jaxen.
  3. 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
  1. Die Verarbeitung grosser XML Dateien mittels DOM und XPath ist ineffizient. Das gilt wahrscheinlich auch für andere DOM basieret Formate wie JSON.
  2. Jaxen XPath ist deutlich schneller als Java XML XPath für kleine und normale DOMs.
  3. Lösungen: 
    1. Alternativen wäre Streaming XML via SAX oder StAX.
    2. Wechsel von XML zu CSV.