- 1 Intro
- 2 Anwendungsgebiete
- 2.1 XSLT - die Programmiersprache im XML Bereich
- 2.2 Aktuelle und vergangene Anwendungen
- 2.3 Professionelle XML Verarbeitung
- 2.4 Technische Dokumentation
- 3 Wichtige Konzepte
- 3.1 Push vs. Pull Stylesheets
- 3.2 Eindeutigkeit der Regelbasis
- 3.3 Namespaces
- 3.4 Schemata
- 3.5 Standards
- 3.5.1 DITA
- 3.5.2 DITA Inhaltsmodell
- 3.5.1 DITA
- 4 Ausgewählte Themen
- 4.1 Transformationen mit XSLT
- 4.1.1 Vortransformationen
- 4.1.2 Komplexe XML-2-XML Transformationen
- 4.1.2.8 Vererbung
- 4.1.2.8 Vererbung
- 4.1.3 XSLT Streaming
- 4.1.3.1 XSLT Akkumulator
- 4.1.3.2 XSLT Iterator
- 4.1.4 Reguläre Ausdrücke
- 4.1.5 Modus vs. Tunnel Lösung
- 4.1.6 Identifikation mit
generate-id()
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.7 Webservice Calls mit doc() und unparsed-text()
- 4.1.8 Stylesheet-Parameter auf der Kommandozeile
- 4.1.9 Leerzeichenbehandlung
- 4.1.10 Mit
translate
Zeichen ersetzen
- 4.1.10.1 Spass mit dem Sequenzvergleich
- 4.1.11 Character Mappings in der Ausgabe
- 4.1.12 JSON mit XSLT 1.0 und Python lxml
- 4.1.1 Vortransformationen
- 4.2 Abfragen mit XQuery
- 4.2.5 XQuery als Programmiersprache
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.5.3.2 SQL Views in MarkLogic
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.6 Hilfreiche XQuery Schippsel
- 4.2.5 XQuery als Programmiersprache
- 4.3 XML Datenbanken
- 4.3.1 Connector zu Marklogic in Oxygen
- 4.3.2 Bi-Temporale Dokumente
- 4.3.2.1 Anlegen des Testszenarios auf der ML Konsole
- 4.3.2.2 Ausführen einiger Beispiel-Queries
- 4.3.3 Webapps mit MarkLogic
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.4 Dokument-Rechte in MarkLogic
- 4.3.5 MarkLogic Tools
- 4.3.5.1 EXPath Konsole
- 4.3.5.2 mlcp - MarkLogic Content Pump
- 4.3.5.3 Deployment-Tools
- 4.4 XSL-FO mit XSLT1.x
- 4.5 Testing
- 4.5.1 Validierung mit Schematron
- 4.5.2 Erste Schritte mit XSpec
- 4.5.1 Validierung mit Schematron
- 4.6 Performanz-Optimierung
- 4.1 Transformationen mit XSLT
- 5 Zusätzliches Know-How
- 5.1 XML Editoren
- 5.2 Quellcode-Versionskontrolle
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.2.2 GIT Kommandos
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.1 XML Editoren
- 6 Glossary
- 7 Tektur CCMS
4.6 Performanz-Optimierung
Bei der Verarbeitung größerer Datenmengen, gibt es mehrere Optionen. Entweder
man verlässt sich auf die Performanzoptimierung, die im XSLT- / XQuery-
Prozessor implementiert ist, bzw. benutzt Methoden, wie XSLT Streaming -
oder man setzt eine Ebene darunter an und schaut zu, was Java so treibt.
Es ist natürlich auch möglich seine Algorithmen umzustricken, den Code zu
optimieren und das ganze (noch) kryptischer zu machen. Aber ganz nach dem
Motto "Never Change a running system" wird vielerorts zunächst einmal an
der Basis gefeilt.
4.6.1 Heap Memory und Garbage Collector
Wenn ich mich recht an mein Informatikstudium erinnere, dann sammelt ein
Garbage Collector automatisch Speicherblöcke ein, die das Java Programm (Saxon) nicht
mehr braucht und übergibt diese an die Heap Memory Verwaltung. Ein Heap
ist meistens ein automatisch balanzierender Baum, der die freigewordenen
Speicherblöcke der Größe nach sortiert verwaltet.
Da auch der Garbage Collector zur selben Zeit läuft, wie unser Java Programm,
können sich die beiden ins Gehege kommen. Hat man für das Java Programm
zuviel Heap-Space reserviert, dann lagert der Garbage Collector seine
temporären Erzeugnisse auf einen langsamen Swap-Bereich aus. Hat man
dagegen zuwenig reserviert, dann ist nicht genügend Platz für das Hauptprogramm vorhanden.
Gebräuchliche Fehlermeldungen sind z.B.:
-
java.lang.OutOfMemoryError: Java heap space
-
java.lang.OutOfMemoryError: GC Overhead limit exceeded
Mehr dazu steht auf der Oracle Webseite zum Thema ↗
Diese viel diskutierten Heap Einstellungen der Java Virtual Machine (JVM), wirken sich
besonders bei Applikationen aus, bei denen der Speicherverbrauch zu einer bestimmten
Zeit nicht vorhersehbar ist, z.b. bei einem Java-Game mit Action- und auch mal Rollenspielelementen.
Hier wäre ein Tuning bzgl. der JVM Heap Optionen angebracht, zumal man das Spiel auch für
Spieler optimieren will, die nicht auf die leistungsfähigste Hardware zugreifen können.
Gängige Optionen, die man beim Java-Aufruf mitgibt, sind bspw.
-
Xms<size> set initial Java heap size
-
Xmx<size> set maximum Java heap size
-
Xss<size> set java thread stack size
Mehr dazu steht auf der Oracle Webseite zum Thema ↗
Für die batch-orientierten Prozesse bei der XML Verarbeitung sind diese Optionen meist nicht ausschlaggebend,
da der Heap bei der Transformation eines grösseren Dokuments linear belastet wird. Hier ist es sogar so, dass man
das obere Limit für den Heap-Speicher mit der unteren Schranke gleichsetzen sollte, um der JVM die Auswahl des geeigneten Speicherbereichs
zur Laufzeit zu ersparen.
Ich benutze für meine performanzlastigen Transformationen eine 10 GB Heap Schranke:
-Xms10g -Xmx10g
Damit lassen sich auch sehr große XML Dateien mit einer Pipeline, wie MorganaXProc ↗
,
die die Ergebnisdokumente der einzelnen Transformationsschritte im Speicher behalten, effizient verarbeiten.