24. Oktober 2022
Mein Praxissemester: Sortieren und Vergleichen von XML-Dateien (und mehr)
„Geodatensysteme und Optimierung: Evaluierung und Optimierung der Testbarkeit von Geodatensystemen, im Speziellen mittels QF-Test“ war das Thema meines Praxissemesters bei QFS. Dieses fand im Rahmen meines Studiums „Geoinformatik und Navigation“ an der Hochschule für angewandte Wissenschaften München statt und dauerte von September 2021 bis Anfang Februar 2022.
Geodaten- und auch Geoinformationssysteme waren schon oft Teil von Übungen/Vorlesungen während meines Studiums und ich konnte somit selbst sehen, wie komplex diese Anwendungen sind. Sie werden dafür verwendet um Geodaten (also Informationen, die man irgendwie auf eine Karte einzeichnen kann) zu verwalten, zu speichern und/oder darzustellen. Oft haben solche Systeme eine Oberfläche, in der auf Karten verschiedene georeferenzierte Geometrien (wie Grundstücke, Straßen oder Grenzen) dargestellt werden. Da die Funktionalität sehr vielfältig und weitreichend sein kann, ist das Thema Testbarkeit sehr wichtig und spannend.
Über das Praxissemester hinaus arbeite ich schon seit längerem als Werkstudentin bei QFS und konnte meine Projekte auch nach dem offiziellen Ende noch weiterführen und abschließen.
Auf der Suche nach einem Problem
Um einen tieferen Einblick in den Einsatz von QF-Test bei Unternehmen mit Geobezug zu bekommen, führte ich verschiedene Interviews mit Kunden. Die Fragen zielten zum einen auf allgemeine Themen ab, beispielsweise ob es für die Geobranche Besonderheiten im Bereich der Qualitätssicherung gibt. Zum anderen fragte ich ab, wie die tägliche Arbeit mit QF-Test aussieht und welche Abläufe getestet werden.
Eine weitere Frage galt der zukünftigen Nutzung: Wo gibt es Optimierungsmöglichkeiten, für welche Bereiche gibt es vielleicht noch keine funktionierende Lösung? Mit diesen Fragen erhoffte ich mir auch, ein mögliches Projekt für mein Praxissemester zu finden.
Das Resultat der Interviews war, dass QF-Test in den meisten Fällen schon super funktioniert und vielseitig eingesetzt wird. Schwierigkeiten QF-Test betreffend gab es nur wenige, beispielsweise mit dem Bildvergleich (da dieser teilweise instabil und aufwendig in der Pflege ist).
Die entscheidende Idee für mein Projekt kam von Herrn Päsler vom Staatsbetrieb Geobasisinformation und Vermessung Sachsen (GeoSN). Er schlug unter anderem vor, die mit QF-Test ausgelieferte Prozedur zum Vergleich von XML-Dateien zu verbessern.
Da der Datenaustausch der im GeoSN verwendeten Anwendungen meist über eine NAS-Schnittstelle erfolgt, wurden hier schon seit längerem entsprechende Tests mit XML-Dateien durchgeführt. Diese XML-Dateien beinhalten neben den Sach- und Geometriedaten der einzelnen Objekte auch die entsprechenden Referenzen der Objekte zueinander, was beim Testen mit entsprechend großen Dateien (ab 10 MB) sehr zeitintensiv ist.
Eine verbesserte Prozedur zum vergleichen großer XML-Dateien
Schon lange gibt es durch die Prozedur qfs.utils.xml.compareXMLFiles
der Standardbibliothek qfs.qft
die Möglichkeit, XML-Dateien zu vergleichen.
Sie bietet eine Vielzahl von Möglichkeiten den Vergleich anzupassen, beispielsweise das Ignorieren von Knoten oder Attributen.
Der bisherige Vergleich funktionierte über ein Jython-Skript, welches die Dateien mithilfe des minidom-Parsers einliest und dann vergleicht. Das Problem mit minidom ist, dass die Dateien, bevor sie verglichen werden können, komplett eingelesen und in einem DOM-Baum dargestellt werden. Das führt bei großen Dateien zu einem sehr hohen Speicherbedarf, was auch die lange Laufzeit es bisherigen Vergleichs erklärt.
Mit meinem neuen Skript ist das Problem der langen Laufzeit nun behoben. Der Vergleich ist nicht mehr mithilfe des minidom-Parsers realisiert, sondern basiert auf dem SAX-Parser. Die Abkürzung „SAX“ steht für „The Simple Application Programming Interface for XML“ und ist ebenso wie minidom eine Python-Bibliothek. Im Gegensatz zum minidom-Parser liest der SAX-Parser die Datei Zeile für Zeile und Attribut für Attribut ein. Dadurch und durch die Struktur des Skriptes wird verhindert, dass sich die gesamte Datei im Arbeitsspeicher befindet und beschleunigt dadurch den Vergleich enorm, sodass er für die 10 MB nur noch ca. eine Minute braucht!
Der Vergleich mit minidom erreichte bei großen Dateien schnell eine CPU Auslastung von über 90 Prozent bzw. schöpfte den QF-Test verfügbaren Arbeitsspeicher aus. Dies konnte dazu führen, dass das Programm abstürzt, oder den Vergleich mit einer Fehlermeldung abbricht.
In meiner Neuentwicklung wird jeder Knoten einer Datei von einem Thread
eingelesen und in einer bestimmten Art und Weise in einer Queue
gespeichert. Es gibt für jede der beiden Dateien einen eigenen Thread
, der sich um das Einlesen kümmert. Ein dritter Thread
vergleicht zeitgleich die Inhalte der beiden Queues
und löscht diese danach. So wird sichergestellt, dass sich der Bedarf an Arbeitsspeicher in Grenzen hält.
Die neue SAX-basierte XML-Vergleichsfunktion in der QF-Test Standardbibliothek.
Effizientes Sortieren
Sämtliche Funktionalitäten die die bisherige Prozedur bot werden in der neuen Prozedure ebenfalls angeboten.
Auch Sortieren vor dem Vergleich ist möglich. Dabei wird der Inhalt der Datei allerdings anders gespeichert, nämlich in einer selbstgeschriebenen von TreeMap
abgeleiteten Klasse. Diese TreeMap
besteht nochmal aus mindestens zwei TreeMap
s. In diesen werden die Knoten der gleichen Ebene gespeichert. Sobald der ursprüngliche Knoten einen Kindknoten enthält, wird eine neue Instanz der speziellen TreeMap
erzeugt und in der Kindknoten-TreeMap
des ursprünglichen Knotens gespeichert. So erhält man schlussendlich eine einzige TreeMap
in der die gesamte Datei gespeichert ist. Nun kann durch diese iteriert und die einzelnen Inhalte vergleichen werden.
Der Grund, weshalb hier eine TreeMap
verwendet wird ist, dass der Inhalt durch einen Komparator bereits zur Laufzeit sortiert gespeichert werden kann. Durch die TreeMap
ist außerdem der Vorgang des Ein- und Auslesens sehr schnell.
Da dabei trotzdem die gesamte Datei im Speicher behalten werden muss, verlängert das vorherige Sortieren die Dauer des Vergleiches, wobei dieser natürlich trotzdem noch schneller ist als die gleiche Aktion mit dem bisherigen minidom-Prozess.
Fazit zu meinem Praxissemester
Neben diesem großen Projekt meines Praxissemesters hatte ich noch viele kleinere Aufgaben und Tätigkeiten. Diese haben den Zeitraum sehr abwechslungsreich und interessant gemacht.
Während des gesamten Praxissemesters hatte ich außerdem Unterstützung von meinem Betreuer, der mir viel bei der Umsetzung dieses Projektes geholfen hat.
Dank dieses Praxissemesters war es mir möglich, meine im bisherigen Studium erworbenen Fähigkeiten anzuwenden, zu vertiefen und auszubauen. Besonders die Zusammenarbeit mit Kunden von QFS war spannend und ich konnte viele neue Eindrücke gewinnen.
Von einer QFS-Mitarbeiterin: "Die Arbeit von Sarah ist sehr wertvoll und für viele sinnvoll, die mit XML-Daten arbeiten. Daher wurde ihre Lösung in QF-Test eingebaut und mit Version 6.0.2 als Teil der Standardbibliothek für alle veröffentlicht."