Beruflich Dokumente
Kultur Dokumente
Bachelorarbeit im
Fachhochschul-Bachelorstudiengang Informatik
Implementierung einer
XML Toolbox für Matlab
ausgeführt von
Philip Masser
0410247028
Philip Masser
Zusammenfassung
Dieses Dokument beschreibt die XML Toolbox als ein Ersatz für die Geodise Toolbox.
Zunächst werden die Gründe für die Entwicklung und Anforderungen an die Lösung
erläutert. Ein klares Ziel war es, performanter (sowohl Laufzeit als auch Speicherver-
brauch betreffend) als die Geodise Toolbox zu sein. Es wird der Aufbau der Lösung
dargestellt und die Funktionen der einzelnen Schichten erläutert. Weiters werden De-
tails der Implementierung beschrieben, die wichtig für die Performanz der Toolbox sind.
Die möglichen Ausgabeformate und der Aufruf der Kommandos für Export und Import
aus der Matlab Umgebung werden kurz dargestellt. Es wird auf Probleme der Toolbox
hingewiesen, die bei der Benutzung auftreten können. Am Ende werden die Ergebnisse
der durchgeführten Tests für Laufzeit und Speicherverbrauch kurz beschrieben und in-
terpretiert. Es wird auch ein Vergleich zur Geodise Toolbox gemacht, und gezeigt, dass
diese Toolbox in jedem getesteten Fall performanter ist als die Geodise Toolbox.
Abstract
This document describes the XML Toolbox, which is an alternative for the Geodise
Toolbox for Matlab. The reasons that led to the development of this Toolbox as well as
the requirements claimed to it are explained. To achieve better performence in the sense
of run time and memory consumption compared to the Geodise Toolbox was declared
as a first degree goal. Next, the general design of the solution and the tasks of each layer
are explained. The available output formats and how the commands for importing and
exporting data from/to the Matlab environment are described shortely. problems that
may occurre while using the XML Toolbox are pointed out. Finally the results of the
memory and run time tests that were performed are described and interpreted. These
are compared with the Geodise Toolbox, and it will be shown that this Toolbox performs
better in every test case.
iii
Inhaltsverzeichnis
1 Einleitung 1
1.1 Was macht die XML Toolbox? . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Stand der Technik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Motivation und Anforderungen . . . . . . . . . . . . . . . . . . . . . . . 2
3 Implementierung 13
3.1 Stringfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 MemoryVector Klasse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 Memory Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.4 Verwendung der Unicode Schicht . . . . . . . . . . . . . . . . . . . . . . 21
4 Anwendung 22
4.1 Client Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Aufruf aus Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.3 XML Parser Bibliotheken . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.4 Probleme der XML Toolbox . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.4.1 Mangelnde Fehlerinformationen . . . . . . . . . . . . . . . . . . . 26
iv
Inhaltsverzeichnis
5 Test 27
5.1 Testmethodik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 Testergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.3 Test der Wachstumsfunktion . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.3.1 Theoretische Tests . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.3.2 Praktische Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Appendix B – Programmteile 39
v
1 Einleitung
Das Ziel dieser Arbeit war es, eine neue Schnittstelle für das Importieren und Ex-
portieren von Daten in bzw. aus Matlab zu erarbeiten. Der Austausch der Daten sollte
dabei über XML geschehen. Dieses Dokument beschreibt die technische Lösung dieser
Aufgabenstellung, mit den daran gestellten Anforderungen, dem Design und die Imple-
mentierung der Lösung, sowie Testverfahren und -ergebnisse.
1
1 Einleitung
haben jedoch den Nachteil, dass kein XML Text erzeugt wird und meist nur numerische
Matrizen, aber keine komplexen Objekte wie Cell-Arrays oder Strukturen geschrieben
bzw. gelesen werden können. Bei Matlabs eingebauten XML-Funktionen andererseits
wird mit DOM XML-Knoten Objekten gearbeitet4 . Beim Exportieren muss solch ein
Objekt zuerst aufgebaut werden, und nach dem Importieren muss dieses wieder analy-
siert werden. Dies ist jedoch nicht praktiktisch für automatisierten Import und Export;
dafür müsste eine Konvertierungsfunktion geschrieben werden.
Neben den von Matlab gebotenen Schnittstellen gibt es weiters sogennante Toolboxes
von Drittanbietern. Darunter ist die Geodise XML Toolbox5 die meist verwendete. Mit
ihr können Matlab Variablen als XML-Dateien exportiert werden und wieder zurück.
Die Geodise Toolbox hat jedoch Probleme betreffend Speicherverbrauch und Geschwin-
digkeit.
Die Liste der hier erwähnten Schnittstellen zum Datenimport und -export ist nicht
vollständig. Es soll hier nur ein Überblick über die wichtigsten gegeben und die Probleme
kurz aufgezeigt werden, die mit diesen zusammenhängen.
4
Siehe xmlwrite bzw. xmlread bei [Mat07b]
5
Siehe [GEO07]
2
1 Einleitung
Generell gibt es vier Möglichkeiten, mit der Matlab Umgebung zu komunizieren. Die
erste sind .M Dateien. Dabei handelt es sich um in der Sprache Matlab geschriebene
Algorithmen, die von der Matlab Umgebung interpretiert werden. Diese eignen sich nicht
für die Entwicklung der XML Toolbox, da sie an die Möglichkeiten von Matlab selbst
gebunden sind, und ein Export bzw. Import nur umständlich implementiert werden kann.
Die zweite stellt die Matlab Engine dar. Das ist eine Art Pipe von einem gewöhnlichem
Programm in beliebiger Programmiersprache zu der Matlab Umgebung. Mit ihr können
Matlab Kommandos ausgeführt werden. Hier tritt das Problem auf, dass nur wenig
Informationen über die Struktur von Objekten ermittelt werden kann.
Die dritte Möglichkeit stellt Java Klassen dar. Diese können direkt aus der Matlab
Umgebung angesprochen werden, sofern diese Umgebung mit einer JVM gestartet wurde.
Es war aber ein erklärtes Ziel, dass keine JVM verwendet werden soll, um die XML
Toolbox auch in der reinen Kommandozeilenumgebung zur Verfügung zu stellen.
Die letzte Möglichkeit sind .MEX Dateien. Dies sind in C oder Fortran geschriebene
und kompilierte Erweiterungen, die ähnlich einer DLL aus Matlab heraus aufgerufen
werden können. Hier werden zusätzliche Methoden angeboten, die in den vorher ge-
nannten Varianten nicht zur Verfügung stehen. Auch ist eine komplette Untersuchung
von Matlab Objekten möglich. Außerdem kann in einer MEX Bibliothek jeder beliebige
Code ausgeführt werden, da zum einen alle Matlab Funktionen zur Verfügung stehen,
jedoch auch alle anderen Möglichkeiten der Sprachen genutzt werden können. Aufgrund
dieser Tatsache wurde die XML Toolbox als C++ MEX Biblothek implementiert.
3
2 Aufbau der XML Toolbox
Dieses Kapitel beschreibt das Gesamtdesign der XML Toolbox und einige Details der
einzelnen Komponenten. Es werden die wichtigsten Konzepte erläutert und wie diese
in Zusammenhang mit den Anforderung stehen. Das hier dargestellte Design ist daher
nicht vollständing, sondern konzentriert sich auf die Hauptbestandteile.
2.1 Überblick
Bei dem Design der XML Toolbox stand die Wartbarkeit und Wiederverwendbarkeit
im Vordergrund. Es stellte sich heraus, dass sich das Importieren und Exportieren in
mehrere, klar getrennte Aufgabengebiete teilen ließ. Jede dieser Elemente konnte für sich
gesehen wieder anderweitig von Nutzen sein. Daher wurden diese Teile in leicht trennbare
Schichten aufgeteilt. Die Schichten bauen zwar aufeinander auf, diese Schnittstellen sind
aber leicht ersetzbar. Abbildung 2.1 zeigt das Schichtenmodell der XML Toolbox. Die
einzelnen Schichten sind:
• Unicode Schicht, für das Lesen und Schreiben von Unicode Dateien und Strings
• XML Schicht, für das Lesen und Schreiben von XML Dateien und Strings
• Matlab Schicht, als Schnittstelle zur Analyse und zum Aufbau von Matlab Objek-
ten
4
2 Aufbau der XML Toolbox
1
Bei der Implementierung wurden Windows 32 und 64 Bit, MacOS X und Linux berücksichtigt
2
Mit Plattform ist hier der verwendete Compiler, das Betriebssystem und die Architektur der Zielma-
schine gemeint
5
2 Aufbau der XML Toolbox
Die wichtigste Aufgabe dieser Schicht sind Typdefinitionen. Hier werden alle grund-
legenden Datentypen definiert, die in den höheren Schichten benötigt werden, und zwar
derart, dass sie bei allen unterstützten Compilern dieselben Datentypen darstellen. Ein
Beispiel hierfür ist die Definition eines vorzeichenbehafteten, 8-Bit Ganzzahltyps. Im
Normalfall ist dies der C-Datentyp char. In Microsoft Visual C++ ist es aber möglich,
den char Datentyp als vorzeichenlos zu definieren. Somit wäre char der falsche Datentyp
für die vorherige Definition, sondern signed char.
Eine weitere Aufgabe dieser Schicht ist die Bereitstellung von Betriebssystemspezifi-
schen Funktionen, wie z.B. das Konvertieren von lokal 8-Bit kodierten Strings in Uni-
code Strings und umgekehrt. Weiters werden hier noch Klassen definiert, die von allen
Schichten gemeinsam genutzt werden. Diese sind IOException, als eine Ein- Ausgabe
Ausnahme, die theoretisch in jeder Schicht auftreten kann, und MemoryHandler, als eine
Klasse zur Allokierung und Deallokierung von Speicher3 .
Ursprünglich wurde die Unicode Schicht als optionale Schicht implementiert. Die feh-
lenden Schnittstellen wären dann von der darüberliegenden XML Schicht bereitgestellt
3
Siehe dazu 3.3
4
STL: Standard Template Library; die C++ Basisbibliothek
5
Siehe [Con06, Kap. 3.9, 3.10]
6
2 Aufbau der XML Toolbox
worden. In Kapitel 3.4 wird erklärt, wieso diese Schicht in der endgültigen Version ent-
halten sein sollte.
Die Klassen, die für das Schreiben von XML zuständig sind, und deren Abhängigkei-
ten, sind in Abb. 2.2 dargestellt. Die hier eingezeichnete Klasse TextEncoder ist jene aus
der Unicode Schicht. Sie hat eine Referenz auf einen Ausgabestrom der STL, in den das
Ergebnis als entsprechend kodierter Unicode String geschrieben wird. Dieser Unicode
Kodierer wird von einem XMLTextEncoder verwendet. Um in Strings zu schreiben, muss
die XMLStringEncoder Klasse verwendet werden.
6
W3C: World Wide Web Consortium
7
2 Aufbau der XML Toolbox
Die XMLTextEncoder Klasse ist ein Wrapper um den Unicode Textkodierer, um die
Trennung von XML und Unicode Schicht zu ermöglichen. Sie stellt die Schnittstelle
für die XMLEncoder Klasse dar. Diese Klasse überprüft die Gültigkeit von Zeichen in
einem gewissen Kontext innerhalb von XML Dateien (z.B. Attributname, Elementname,
Attributwert, Text). Gegebenenfalls wird ein Zeichen durch eine entsprechende Entität
ersetzt oder eine Ausnahmebedingung ausgelöst. Die Implementierung hält sich dabei
an die W3C XML Spezifikation (siehe [W3C06, Kap. 2]).
Die von Benutzern direkt verwendete Klasse ist XMLWriter. Sie bietet eine einfache
High-Level API zum Erstellen von XML Dokumenten. Sie enthält Methoden für das
Öffnen von Elementen (inklusive Angabe von Attributen), Schließen von Elementen,
Schreiben von Text, . . .
Das Schreiben von XML Dokumenten wurde bewusst einfach gehalten. Ein W3C
konformer Ansatz mit DOM Builder würde verlangen, dass zuerst der gesammte Inhalt
des XML Dokuments als DOM Baum im Arbeitsspeicher aufgebaut wird, und erst dann
serialisiert werden kann. Durch den einfacheren Ansatz ist eine Zwischenspeicherung
nicht notwendig, das Dokument kann sofort in die Datei bzw. den String geschrieben
werden, womit weniger Speicher zur Laufzeit verbraucht wird (v.a. beim Schreiben von
Dateien).
Das Lesen von XML Dokumenten mittels der XML Schicht basiert auf dem SAX
Parser Prinzip der W3C XML Spezifikation. Es gibt eine abstrakte Handler Klasse, hier
XMLHandler genannt, die von Benutzern abgeleitet werden muss. Eine Instanz solch
8
2 Aufbau der XML Toolbox
einer Klasse wird über Ereignisse während des Parses eines Dokuments informiert. Das
eigentliche Parsen des Dokuments übernimmt eine Instanz einer XMLReader Klasse, die
ebenfalls abstrakt ist. Diese liest das XML Dokument über einen STL Eingabestrom.
Instanzen der XMLReader Subklassen werden mit der Singletonklasse XMLReaderFactory
erzeugt. Diese Zusammenhänge sind in Abb. 2.3 abgebildet.
Die Matlab Schicht bietet zum Auslesen von Variablen die Klasse MatlabAnalyzer.
Diese Klasse bietet alle Low-Level Funktionen zur Auswertung von Matlab Objekten, die
die Matlab Umgebung selbst bietet. Für komplexe Objekte jedoch bietet sie Hilfsfunk-
tionen für den leichteren Umgang z.B. mit Cell-Arrays, Strukturen und dünnbesetzten
Matrizen (Sparse Matrices).
Für das Definieren von Matlab Objekten wird die Klasse MatlabBuilder, zusammen
mit MatlabElement Objekten verwendet. Ein MatlabElement ist ein Informationscon-
tainer, der mit allen relevanten Daten gefüllt wird. Es kann logische, ganzzahlige, reelle
und Textdaten aufnehmen, zusammen mit einem Namen und Typinformationen. Diese
Elemente werden dann von einem MatlabBuilder in die entsprechende Matlabdarstel-
lung umgewandelt. Dabei können Elemente Teile von anderen Elementen werden, z.B.
7
Siehe http://xml.apache.org/xerces-c/
9
2 Aufbau der XML Toolbox
bei Feldern einer Struktur, aber auch bei Real- und Imaginärteil von komplexen Matri-
zen.
Intern arbeitet der MatlabBuilder mit zwei Stacks von MatlabElementen. Der erste ist
der sogenannte Parsed-Stack, der zweite der Built-Stack. Geparste Elemente, die evtl.
noch zu bearbeiten sind, werden auf den Parsed-Stack gelegt. Solange sie hier liegen,
können sie noch verändert werden. Wenn alle Daten gesammelt sind, können sie in den
entsprechenden Matlab Datentyp umgewandelt werden, und werden auf den Built-Stack
verschoben. Containerelemente auf dem Parsed-Stack besitzen einen Stackpointer auf
den Built-Stack. Alle Elemente, die über diesem Pointer liegen, sind Unterelemente des
Containerelements.
Als Beispiel für die Funktionsweise des MatlabBuilders wird eine kleine Struktur er-
stellt. Sie besitzt zwei Felder: Description, die einen Text enthält, und Value, eine
komplexe Matrix. Die aufzubauende Struktur soll schematisch folgende Form haben:
Structure {
Description = ‘‘6. Wurzel aus 4096’’
Value = [6 3+5.196i -3+5.196i -6 -3-5.196i 3-5.196i]
}
Als XML Dokument könnte diese Strukture z.B. wie folgt aussehen:
<r o o t type=” s t r u c t ” s i z e=”1 1”>
<D e s c r i p t i o n type=” c h a r ” s i z e=” 1 18 ”>6 . Wurzel aus 4096</ D e s c r i p t i o n>
<Value type=” complex ” s i z e=”1 6 ”>
<item type=” d o u b l e ” s i z e=”1 6 ”>6 3 −3 −6 −3 3</ item>
<item type=” d o u b l e ” s i z e=”1 6 ”>0 5 . 1 9 6 5 . 1 9 6 0 −5.196 −5.196</ item>
</ Value>
</ r o o t>
Abbildung 2.4 zeigt schrittweise den Vorgang, wie solch eine Struktur erstellt werden
kann. Die türkise Farbe stellt MatlabElemente dar, die noch nicht zu Matlab Datentypen
umgewandelt wurden, die grüne jene, bei denen dies geschehen ist. Zuerst wird das um-
schließende Strukturelement auf den Parsed-Stack gelegt (a). Sein Stackpointer zeigt auf
das Ende des Built-Stacks. Somit werden alle folgenden Elemente Felder dieser Struktur
werden. Als nächstes wird der Beschreibungstext als Stringelement geparst (b). Da keine
10
2 Aufbau der XML Toolbox
String
Struct Struct
Parsed Built Parsed Built
a) b)
Complex
Struct String Struct String
Parsed Built Parsed Built
c) d)
Double Double
Complex Complex Double
Struct String Struct String
Parsed Built Parsed Built
e) f)
Build
Complex
Double
Complex Double Complex
Struct String Struct String
Parsed Built Parsed Built
g) h)
Build
Structure
Complex
i) Struct String j) Struct
Parsed Built Parsed Built
Unterelemente möglich sind, wird es sofort auf den Built-Stack übertragen (c). Wie zu
sehen ist, wird der Text dabei nicht in die Matlab-interne Datenstruktur umgewandelt;
mehr dazu später. Das Element der komplexen Matrix wird als nächstes geparst und
auf den Parsed-Stack gelegt (d). Der Stackpointer zeigt über das Textelement. Dieses
gehört nicht zur Matrix. Der Inhalt der Matrix muss als nächstes geparst werden. Dies
sind der Real- und Imaginärteil, jeweils ein Double-Array. Sie werden auf den Built-Stack
verschoben (e - f). Auch diese Elemente werden nicht in ihre Matlab-Darstellung umge-
wandelt. Das liegt daran, dass solche Elemente ein Bestandteil eines anderen Elementes
werden können, und nicht als eigenständige Objekte an Matlab übergeben werden. Im
Beispiel werden die Double-Arrays Teile der komplexen Matrix.
Jetzt sind alle Informationen für die komplexe Matrix vorhanden. Sie kann umge-
wandelt werden. Dazu werden alle Unterelemente vom Built-Stack (die beiden Double-
Arrays) und das Matrix Element vom Parsed-Stack genommen. Es wird eine komplexe
11
2 Aufbau der XML Toolbox
Matrix als Matlab Datentyp erzeugt und auf den Built-Stack gelegt (h). Nun bleibt nur
noch das Strukturelement übrig. Es wird vom Parsed-Stack genommmen, und zusam-
men mit den Unterelementen vom Built-Stack in eine Matlab Struktur umgewandelt (i).
Das Textelement wird dabei ebenfalls in den entsprechenden Matlab Typ umgewandelt.
Die fertige Struktur mit dem Text- und Matrixelement landet auf dem Built-Stack (j).
2.7 Zusammenfassung
In diesem Kapitel wurden die Grundlagen der XML Toolbox erläutert. Das Schicht-
modell mit der Plattform-, Unicode-, XML-, Matlab- und Client-Schicht, sowie die Be-
deutung und Aufgabe jeder einzelnen Schicht wurden erklärt. Auch wurde dargelegt,
inwiefern die einzelnen Schichten zur Performanz bzw. Erweiterbarkeit beitragen. Auch
wurden die beiden Erweiterungsmöglichkeiten erläutert, zum einen in der XML Schicht,
indem eine andere XML Parser Bibliothek verwendet wird, zum anderen in der Client
Schicht, in der die eigentliche Arbeitslogik, und somit unterschielichste Formate definiert
werden können.
12
3 Implementierung
Dieses Kapitel beschreibt wichtige Implementierungsdetails der XML Toolbox. Es wer-
den jene Abschnitte behandelt, die maßgeblich zur Performanz beitragen. Das wichtig-
ste Ziel bei diesen Bereichen war, dass so wenig Speicher wie möglich durch redundante
Datenkopien verschwendet wird, auch desshalb, weil mit dem Kopievorgang Laufzeitein-
bußen zusammenhängen.
3.1 Stringfunktionen
Wie bereits in Kapitel 2.3 erwähnt, werden in der Unicode Schicht Stringkonver-
tierungsfunktionen definiert. Diese sollen die Umwandlung von verschiedenen String-
typen erleichtern. Sie sind als Templateklasse implementiert, wobei die Parameter die
Ursprungs- und Zieldatentypen darstellen. Diese Datentypen sind z.B. char oder wchar t.
Für jedes Datentyppaar muss eine eigene, explizite Spezialisierung implementiert werden.
So können unterschiedliche Behandlungen von Stings bei der Konvertierung berücksich-
tigt werden.
Ein Beispiel, wie diese Klasse zur Performanz von Code beitragen kann, ist die Kon-
vertierung von unsigned short (kurz ushort) zu wchar t Strings. Beide Datentypen
stellen einen vorzeichenlosen, 2-Byte Buchstaben dar, und sind theoretisch austausch-
bar. Dennoch sind die Datentypen nicht dieselben1 . Somit ist in C++ ein Zeiger auf den
einen Typ nicht zuweisungskompatibel mit einem Zeiger auf den anderen. Es ist ein ex-
pliziter Typecast notwendig. Dabei wird keine Kopie erzeugt. Diese Implementierung ist
schneller und verbraucht keinen zusätzlichen Speicher, verglichen mit der Stringkonver-
tierung von char auf wchar t. Dort muss der Text kopiert und auch konvertiert werden,
da die interne Darstellung eine andere ist.
1
Hier wird wchar t als Buit-in Datentyp angenommen
13
3 Implementierung
Die Wartbarkeit von Code kann durch diese Stringfunktionen auch erhöht werden.
Angenommen ein Projekt kann sowohl mit Unicode als auch ohne kompiliert werden. Je
nachdem wird ein eigener Buchstabendatentyp anders definiert. Nun müssten je nach
Kompilierungsart unterschiedliche Konvertierungsfunktionen aufgerufen werden. Dies
kann automatisch durch die Stringfunktionsklasse gelöst werden.
// w c h a r t zu u s h o r t K o n v e r t i e r u n g
template<>
c l a s s S t r i n g F u n c t i o n s <wchar t , u s h o r t > {
// S p e z i f i s c h e Implementierung
};
// w c h a r t zu c h a r K o n v e r t i e r u n g
template<>
c l a s s S t r i n g F u n c t i o n s <wchar t , char> {
// S p e z i f i s c h e Implementierung
};
// Char−t y p d e f i n i t i o n
#i f d e f UNICODE SUPPORT
typedef u s h o r t m y c h ar t yp e ;
#e l s e
typedef char m y c h ar t yp e ;
#endif
// Der S t r i n g
const wchar t ∗ o r i g s t r i n g = L” O r i g i n a l Wide−S t r i n g ” ;
// K o n v e r t i e r u n g
m y c h a r t yp e ∗ conv = S t r i n g F u n c t i o n s <wchar t , my char type>
: : convert ( o r i g s t r i n g ) ;
14
3 Implementierung
Bei diesem Codeabschnitt wird je nach Definition von my char type die entsprechende
Spezialisierung bereits zur Compilezeit ausgewählt. Es erfolgt keine weitere Überprüfung
auf das Makro UNICODE SUPPORT, um den String umzuwandeln.
Beim Hinzufügen von Elementen zu einem Vektor muss eventuell zusätzlicher Speicher
allokiert werden. Theoretisch genügt es, Speicher für ein einziges Element hinzuzufügen.
Jedoch ist es wahrscheinlich, dass noch weitere Elemente folgen werden. Damit nicht bei
jedem Hinzufügen allokiert werden muss, macht es durchaus Sinn, mehr Speicher bereit-
zustellen, als momentan benötigt wird. Die Größe dieses überschüssigen Speichers ist
aber nicht unbedeutend. Einerseits sollte der Bereich nicht zu groß gewählt sein, um kei-
nen Speicher unnötig zu verschwenden, andererseits sollte die Anzahl von Allokierungen
spürbar vermindert werden. Angenommen der Speicher wird jeweils um 100 Elemen-
te vergrößert. Dieser Wert ist nicht zu groß, als dass er als Verschwendung betrachtet
15
3 Implementierung
werden kann, andererseits sind sehr viele Allokierungen notwendig, falls die endgültig
benötigte Größe z.B. 1.000.000 beträgt. Auch ist ein konstanter Wachstumsfaktor, mit
dem die aktuelle Größe multipliziert wird, nicht zufriedenstellend. Entweder ist dieser
hoch gewählt, für eine starke Erhöhung bei kleinen Werten, oder niedrig, für rationale
Vergrößerung bei hohen Werten. Der Faktor ist aber für den jeweils anderen Fall nicht
akzeptabel. Die beste Möglichkeit liegt in einem dynamischen Wachstumsfaktor.
16
3 Implementierung
x k
f (x; k; λ) = 1 − e−( λ ) (3.1)
x k
f (x; k; λ; i; m; a) = m · e−i·( λ ) + a (3.2)
Hierbei ist x die Ordnung der Ursprungsgröße, angegeben als log10 (s), wobei s die
Größe ist, k und λ wie oben, i der interne Anpassungsfaktor, m ein Multiplikator und
a ein additiver Wert. Durch ein Testprogramm wurden die optimalen Werte ermittelt,
indem das Wachstumsverhalten mit drei vorgegebenen Wertepaaren verglichen wurde3 .
Die Werte, die die geringste Abweichung von den geforderten Daten aufweisen, sind
k = 1, 5; λ = 7, 5; i = 9, 2; m = 17; a = 0, 1 (3.3)
Mit diesen Werten erfüllt die Wachstumsverhaltenskurve die oben angegebenen Anfor-
derungen am besten. Sie wird in Zukunft dynamischer Weibull Faktor Funktion genannt.
Abb. 3.2 stellt den Graphen der Wachstumsfunktion dar. Abb. 3.3 stellt das Verhält-
nis des Größenzuwachs und des Wachstumsfaktors zur aktuellen Größe dar, bei einer
anfänglichen Elementzahl von 1. Einige ausgewählte Datenpuntke sind in Tabelle 3.1
dargestellt. Wie zu sehen ist, liegt der Wachstumsfaktor bei kleinen Datengrößen relativ
hoch (17,1). Der Zuwachs ist höher als die aktuelle Größe, bis zum Wert von 2.525. Der
genaue Grenzwert ist 3.199, da aus Formel 3.2 und 3.3 folgt:
2
siehe [Wei51]
3
siehe Appendix B, “weibull parameter test”
17
3 Implementierung
v v
w−a 1−0,1
u u
u
k ln m
3
u
2
ln 17
log10 (s) = x = λ · − = 7, 5 · − ≈ 3, 505
t t
i 9, 2
⇒ s = 103,505 ≈ 3.199
(w ist hier der Wachstumsfaktor). Hier fällt der Wachstumsfaktor unter 1, und nähert
sich asymptotisch dem Wert 0,1 (10% Wachstum).
Das Verhalten und die Performanz dieser Wachstumsfunktion und anderen, weiter
oben erwähnten Ansätzen wurde getestet. Die konkreten Testfälle und -ergebnisse wer-
den in Kap. 5.3 dargelegt.
18
3 Implementierung
19
3 Implementierung
Die Daten, die an die Matlab Umgebung übergeben werden, werden in der XML Tool-
box jedoch oft in tiefer liegenden Schichten erzeugt. Wegen der Trennung der Schich-
ten ist es nicht ratsam, die Matlab spezifischen Allokationsmethoden bereits in diesen
Schichten zu verwenden. Eine mögliche Lösung wäre, alle Daten, die an Matlab über-
geben werden, direkt vor der Übergabe in einen neuen Speicherbereich zu kopieren,
der mittels Matlab Funktionen allokiert wurde. Dieser Ansatz erfordert jedoch wieder
unnötiges Kopieren, und somit Laufzeiteinbuße.
Die in der XML Toolbox gewählte Lösung ist die des MemoryHandler. Ein Memory
Handler ist ein Objekt, das für die Allokierung und Deallokierung von Speicher zuständig
ist und dabei jede Funktion verwenden kann. So verwendet z.B. der Standard-Memory
Handler die globalen Operatoren new und delete, und der Matlab-Memory Handler die
Matlab Funktionen mxMalloc und mxFree. Bei allen speichererzeugenden Funktionen4
in der XML Toolbox kann solch ein Memory Handler Objekt angegeben werden. Durch
die Angabe des Matlab-Memory Handlers werden alle an Matlab übergebenen Daten
von Anfang an mit den Matlab Funktionen allokiert. Das zusätzliche Kopieren dieser
Daten ist somit nicht mehr notwendig.
Das Memory Handler Prinzip kann auch auf Bereiche angewandt werden, die eigentlich
keinen Speicher allokieren, der an Matlab zurückgegeben werden wird. Dennoch kann
ein Handler angegeben werden. Dies kann evtl. für höhere Performanz genutzt werden,
indem z.B. Handler für Memory Pools verwendet werden.
4
Darunter fallen z.B. die Stringkonvertierungsfunktionen aus Kap. 3.1, oder der MemoryVector aus
Kap. 3.2
20
3 Implementierung
Bei der Entwicklung der XML Toolbox zeigte sich schnell, dass eine intene String-
darstellung als 8-Bit Zeichenketten nicht praktisch ist. In der eigentlichen Implementie-
rungsschicht, der Client Schicht, wurde mit 8-Bit Strings gearbeitet. Die Schnittstellen
zu Matlab und XML jedoch arbeiteten mit 16-Bit Unicode Strings. Es musste bei jedem
Schreiben und Lesen von XML Fragmenten eine Stringkonvertierung vorgenommen wer-
den. Auch bei der Auswertung oder Erzeugung von Matlab Strings musste konvertiert
werden.
Durch die Einführung der Unicode Schicht wurde dieses Problem behoben. Die String-
typen sind mit dieser Schicht alle äquivalent und können ohne Konvertierung oder Ko-
pieren verwendet werden. Somit wird weniger Speicher verbraucht und die Applikation
läuft schneller. Die Stringkonvertierungsfunktionen (siehe Kap. 3.1) ermöglichen aber
dennoch eine Unicode freie Version, ohne Änderungen am Source Code vornehmen zu
müssen.
21
4 Anwendung
Dieses Kapitel beschreibt kurz die implementierten Handler der Client Schicht. Es
erläutert weiters die Matlab-Schnittstellen, über die die verschiedenen Funktionen der
XML Toolbox aufgerufen werden können, und wie die Ein- bzw. Ausgabeformate die-
ser Funktionen aussehen. Weiters wird erläutert, welche XML-Parser-Bibliotheken un-
terstützt werden. Detailierte Informationen zu den Formaten und Funktionen befinden
sich auf der beiliegenden CD im Benutzerhandbuch (siehe Appendix A). Am Ende wer-
den noch einige Probleme der XML Toolbox aufgezeigt.
22
4 Anwendung
halt wird in einem CONTENT Feld als String gespeichert. Da XML-Elemente desselben
Namens unterschiedliche Inhalte besitzen können (z.B. optionale Unterelemente), dies
jedoch nicht als Matlab Struktur abgebildet werden kann (da alle Strukturen einer Struk-
turmatrix dieselben Felder besitzen), werden Elemente mit demselben Namen in Cell-
Arrays gekapselt. Somit können diese auch in Matlab unterschiedliche Inhalte besitzen.
Die XML Toolbox stellt vier MEX-Files zur Verfügung. Diese dienen als Wrapper,
um die Eingabeparameter zu überprüfen, und rufen die entsprechende Client-Handler-
Implementierung auf, die das gewünschte Format importiert bzw. exportiert. Die bereit-
gestellten Kommandos sind:
23
4 Anwendung
Weitere Informationen zu den XML Formaten und den Kommandos befinden sich im
Benutzerhandbuch (siehe Appendix A).
Zu Beginn der Entwicklung wurde hier auf die Xerces Bibliothek aufgebaut. Ich hatte
persönlich bereits Erfahrung mit dieser Bibliothek und Matlab verwendet intern ebenfalls
Xerces. Als die Impementierung weiter fortgeschritten war, und Tests mit Dokumenten
durchgeführt wurden, die große Elementinhalte besitzen (z.B. 1.000.000 Fließkommazah-
len), sind Probleme mit der Xerces Bibliothek aufgetreten. Durch Zeitmessungen wurde
festgestellt, dass Xerces sehr viel Zeit braucht, um den Textinhalt einzulesen. Somit dau-
erte der Import sehr lange (Test nach 10 Minuten abgebrochen, ohne dass Xerces den
Text vollständig eingelesen hatte).
1
Siehe http://xml.apache.org/xerces-c/
2
Siehe http://expat.sourceforge.net/
24
4 Anwendung
Später wurde mir die Expat Bibliothek empfohlen. Diese hat dieses Problem nicht.
Hier wird immer nur eine vorher definierte Anzahl an Bytes eingelesen und geparst. Somit
reagiert der Parser schneller, jedoch nur mit Fragmenten des Textinhalts. Dies stellte
jedoch kein Problem dar, da die darüberliegende Matlab Schicht bereits für diesen Fall
vorbereitet war. Tests ergaben, dass dieselben Testfälle wie mit der Xerces Bibliothek
mit Expat nach ∼ 7 Sekunden abgeschlossen waren.
Die Xerces Bibliothek wird noch unterstützt, es wird aber empfohlen, die Expat Bi-
bliothek zu benutzen.
25
4 Anwendung
Beim Import werden, wie bereits erwähnt, Unterelemente mit gleichem Namen in ein
Cell-Array gekapselt. Für diesen Zweck werden die Unterelemente beim Import alpha-
betisch sortiert. Bei einem Export der erzeugten Matlab-Struktur werden die Elemente
somit ebenfalls alphabetisch sortiert ausgegeben. Ein solches Dokument kann für einen
nachgestellten Prozess unlesbar sein, wenn dieser die Elemente in einer gewissen Reihen-
folge erwartet. Auch kann das ursprüngliche XML Dokument mit einem Schema validiert
worden sein, zu dem das neue Dokument nicht mehr valide ist.
26
5 Test
Dieses Kapitel beschreibt die durchgeführten Tests mit der XML Toolbox. Es werden
zunächst die Testmethodik und verwendete Ressourcen beschrieben, gefolgt von der In-
terpretation der Testergebnisse. Alle Codeteile für die Tests befinden sich in Appendix
B, die Testfälle selbst mit den jeweiligen Ergebnissen in Appendix C. Alle Tests wur-
den mit Matlab Version 7.3.0.267 (R2006b) auf einem PC mit Microsoft Windows XP,
Service Pack 2, 1024 MB RAM und Intel Pentium 4 Dual Core 3 GHz Prozessor durch-
geführt. Dabei wurde ausschließlich die Expat XML Parser Bibliothek verwendet. Die
XML Toolbox wurde mittels Microsoft Visual Studio .NET 2005 (VC8.0) kompiliert.
5.1 Testmethodik
Die XML Toolbox wurde hinsichtlich verschiedener Aspekte getestet. Zunächst wurde
die reine Funktionalität getestet. Mit diesen Tests wird überprüft, ob die Toolbox Matlab
Daten korrekt importiert und exportiert. Weiters wurden Performanztests durchgeführt,
sowohl die Laufzeit von Import und Export, als auch deren Speicherverbrauch betreffend.
Weitere Tests vergleichen die XML Toolbox mit der als Vorlage dienenden Geodise
Toolbox.
Funktionalitätstests
Bei diesen Tests wird eine Matlab Datenstruktur in eine Datei exportiert und wieder
importiert. Die importierte Struktur wird dann mit der Originalstruktur verglichen. Da
Fließkommazahlen nur bis zu einer gewissen Genauigkeit exportiert werden, können diese
geringfügig vom Original abweichen. Die maximal erlaubte Abweichung wird über einen
Grenzwert festgelegt. Der Vergleich der Strukturen erfolgt über die compare Funktion
von Nicholas Gigis1 , mit kleinen Änderungen2 .
1
siehe http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=3449 (Stand
31.7.2007)
2
siehe Appendix B, “compare”
27
5 Test
Laufzeittests
Die Laufzeittests führen eine beliebige Import- oder Exportoperation aus, wobei die Zeit
gemessen wird, die für diese Operation benötigt wurde. Es können mehrere Testläufe
durchgeführt werden, um mehr Daten zu erhalten. Die Zeitmessung erfolgt über die
Matlab Methoden tic und toc3 .
Speichertests
Beim Testen von Speicherverbrauch wird ebenfalls eine Import- oder Exportoperation
ausgeführt. Vor der Operation wird der aktuelle Speicherverbrauch des Matlab Prozes-
ses notiert. Dies wird ebenfalls nach der Operation gemacht. Die Differenz wird mit der
Größe der erzeugten Daten (z.B. beim Import von Datenstrukturen) verglichen. Diese
wird über das Matlab Kommando whos ermittelt, und sollte immer genau der Differenz
entsprechen. Hier könnten lediglich eventuelle Speicherlecks entdeckt werden. Diese sind
aber unwahrscheinlich, da Matlab nicht mehr benötigten Speicher nach der Ausführung
von MEX-Routinen automatisch wieder freigibt. Wichtiger ist der Speicherverbrauch
während der Ausführung der Operation. Die Daten über den Speicherverbrauch wer-
den über das Profilingprogramm “Process Explorer for Windows v10.21” von Mark
Russinovich4 ermittelt.
5.2 Testergebnisse
In diesem Abschnitt werden die Ergebnisse der druchgeführten Tests interpretiert. Die
duchgeführten Testfälle und die konkreten Ergebnisse sind in Appendix C beschrieben.
28
5 Test
des XML-Attribut-Import-Handlers treten jedoch Probleme auf. Diese sind in Kap. 4.4
genauer ausgeführt.
Die Zeittests zeigen, dass die Latin-1 Kodierung am effizientesten geschrieben und
gelesen werden kann. Auch sinkt damit die Dateigröße im Vergleich zu UTF-16. Jedoch
können damit nicht alle Zeichen dargestellt werden. UTF-8 ist beinahe gleich effizient
und hat diesen Nachteil nicht. Es sollte daher diese Kodierung verwendet werden.
Der Export ist offensichtlich performanter (Zeit und Speicher), wenn kleine Daten-
strukturen exportiert werden. Dies zeigen die Speichertestfälle, wenn als Referenzwert
die Datengröße in Matlab herangezogen wird. Bei den Testfällen 4a und 4b wird kaum
Speicher verbraucht. Bei Testfall 4c und 4d liegt der Speicherverbrauch mit ∼50 MiB5
etwa bei dem Doppelten der Strukturgröße. Man kann ebenfalls sehen, dass mehrere
große Strukturen exportiert werden wie einzelne (Speicher bei Testfall 4d gleich wie
bei 4c). In den Testfällen 4e und 4f können die Daten nicht unterteilt werden, und die
Speicherauslastung steigt rapide.
Der Import mit statischer und dynamischer Speicherermittlung sind annähernd gleich
schnell. Nur beim Import von vielen kleinen Objekten ist die dynamische Ermittlung
merklich langsamer (Testfall 4b). Die stark erhöhte Speicherauslastung bei großen Da-
tenmengen (Testfälle 4e und 4f) kann ich mir nicht erklären. Laut dynamischem Weibull-
faktor müsste bei Testfall 4f lediglich 3,14 MiB überschüssiger Speicher allokiert werden,
und nicht 534,0 MiB (siehe Kap. 5.3).
Im Vergleich zur Geodise Toolbox ist sowohl Export als auch Import immer schnel-
ler und verbraucht weniger Speicher. Besonders bei vielen kleinen (Testfall 4a und 4b)
und sehr großen Elementen (4e und 4f) ist Geodise merklich langsamer und verbraucht
mehr Speicher (Testfall 4f konnte wegen Speicherproblemen weder exportiert noch im-
portiert werden). Beim Export von großen Strukturen (Testfall 4c und 4d) ist Geodise
etwas langsamer. Der Speicherverbrauch ist dennoch um einiges höher. Der Import dieser
Testfälle dauert wiederum merklich länger, sodass die Tests hier abgebrochen wurden.
In dieser Zeit stieg der Speicherverbrauch so stark, dass das Betriebssystem 80% der
Auslagerungsdatei gefüllt hatte.
5
1 MiB (Mebi Byte) ≡ 220 = 1.0242 = 1.048.576 Bytes
29
5 Test
Das Verhalten der implementierten Wachstumsfunktion und der beiden oben erwähn-
ten Funktionen wurde getestet. Zum einen wurde ein theoretischer Test durchgeführt,
mit dem ermittelt wird, wie viele Reallokierungen nötig sind, bis eine gewünschte Größe
erreicht wird, und um wieviel die erbrachte Größe die gewünschte überschreitet. Weiters
wurde ein praktischer Test durchgeführt, mit dem das tatsächliche Verhalten der drei
Funktionen in der Matlab Umgebung unter Realbedingungen verglichen wurde.
Es ist ersichtlich, dass der dynamische Weibull Faktor kleine Größen am schnellsten
erreicht. Dafür hat er in diesem Bereich die größte Differenz zum benötigten Wert. Bei
den höheren Werten braucht er etwas mehr Allokierungen als der fixe Faktor, hat dafür
aber eine merklich kleinere Differenz. Die Erhöhung um einen fixen Wert benötigt bereits
bei mittleren Größen viel mehr Allokierungen und ist deswegen nicht geignet.
6
siehe Appendix B, “growth algorithm test”
30
5 Test
Es wurden drei Situationen getestet, bei denen jeweils große Datenmengen importiert
wurden. Beim ersten Test wurde eine Struktur verwendet, die mittels createDS(1)
erzeugt wurde7 . Diese enthält zwei mittelgroße und eine große Matrix. Beim zweiten
wurde eine Struktur durch createDS(3) erzeugt. Diese hat sechs mittelgroße und drei
große Matrizen. Im letzten Test wurde eine zufällige Matrix mittels rand(300, 100,
100) erzeugt. Diese enthält 3.000.000 Elemente.
Tabelle 5.2 zeigt das Verhalten der verschiedenen Algorithmen bei den Testfällen.
Es wird die Größe der importierten Daten, der Speicherverbrauch vor und nach dem
Import, der höchste Speicherverbrauch während des Imports, und die benötigte Zeit
angegeben. Auch wird der überschüssige Speicher angegeben, um den der Höchstwert
den Speicherverbrauch nach dem Import übersteigt. Es ist zu sehen, dass die Erhöhung
um einen fixen Wert um den Faktor 40 langsamer ist als die beiden anderen Methoden.
Diese benötigen ungefähr gleich lange, die Weibull Faktor Methode ist aber geringfügig
langsamer. Dafür hat diese weniger Speicher während des Imports verwendet. Die Frage,
warum bei der Erhöhung um einen fixen Wert am meisten Speicher verwendet ist, obwohl
7
Siehe Appendix B, “createDS”
31
5 Test
dort der Overhead maximal 100 Elemente betragen kann, konnte ich nicht klären.
Funktion Vorher (MiB) Nachher (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
createDS(1) (7,86 MiB)
Fixer Wert 30,3 39,1 69,8 30,7 101,93
Fixer Faktor 30,4 39,3 45,1 5,8 2,46
Weibull Faktor 30,3 39,0 39,0 0,0 2,55
createDS(3) (23,6 MiB)
Fixer Wert 54,0 78,5 153,7 75,2 304,89
Fixer Faktor 54,0 78,7 128,5 49,8 7,23
Weibull Faktor 54,0 78,4 120,9 42,5 7,63
rand(300, 100, 100) (22,89 MiB)
Fixer Wert 30,4 — 192,2 161,81 —2
Fixer Faktor 31,1 54,1 170,8 116,7 7,29
Weibull Faktor 31,1 54,8 154,4 99,6 7,65
1
Verglichen mit Speicher vor dem Import
2
Nach 10 Minuten abgebrochen
32
6 Zusammenfassung und Ausblick
Die XML Toolbox ermöglicht es, Datenstrukturen aus Matlab effizient zu exportie-
ren und wieder zu importieren. Es können somit Strukturen in einem XML Format
gespeichert und ausgetauscht werden, welches auch von Drittkomponenten gelesen bzw.
geschrieben werden kann, im Gegensatz zum proprietären Mat-Dateiformat von Matlab.
Weiters können beliebige XML Dokumente in Matlab Strukturen umgewandelt werden,
um sie dort zu verarbeitet. Dabei sind die Formate kompatibel zur bereits existierenden
Geodise XML Toolbox. Jene kann durch diese Toolbox ausgetauscht werden.
Der modulare Aufbau der XML Toolbox ermöglicht es, einfach neue Formate hinzu-
zufügen. Es müssen nur die entsprechenden Import- und Export-Handler geschrieben
und eine Schnittstelle für die Matlaboberfläche erstellt werden. Es können auch andere
XML-Parser Bibliotheken mit geringem Aufwand verwendet werden.
Die Tests zeigen, dass der Import- und Exportvorgang mit geringem Speicherver-
brauch und in kurzer Zeit erfolgen. Im Vergleich zur Geodise Toolbox zeigt sich, dass
die Vorgänge um ein vielfaches schneller ablaufen und dabei eine geringere Speicheraus-
lastung haben. Auch können größere Matrizen behandelt werden, ohne wegen Speicher-
mangel abgebrochen zu werden.
In Zukunft könnten noch weitere XML Formate bei Bedarf implementiert werden. Die
Portierung auf weitere Plattformen, wie unterschiedl. Linux Distributionen oder Solaris,
stehen noch aus. Durch die Abstraktion mittels der Plattformschicht wird dies jedoch
keine großen Auswirkungen haben und mit geringem Aufwand geschehen können.
Einige Probleme mit der XML Toolbox könnten auch behoben werden. Bei einem
fehlgeschlagenen Import von XML Daten sollten detailiertere Meldungen erfolgen. Mo-
mentan werden lediglich ungültige Zeichen und invalide XML Dokumente gemeldet. Bei
logischen Fehlern der Struktur des XML Dokuments (z.B. falsche Dimensionsangaben)
wird nur gemeldet, dass das Importieren fehlgeschlagen ist, jedoch nicht warum.
33
6 Zusammenfassung und Ausblick
Das Umsortieren der Strukturelemente bei einem XML-Attribut Import und Export
(siehe Kap. 4.4) kann Probleme bereiten, v.a. wenn die XML Dokumente mit einem
Schema validiert werden sollen. Dieses Problem kann umgangen werden, wenn die Sche-
mata entsprechend angepasst werden. Falls dies nicht möglich ist, und die Validierung
wichtig ist, könnte eine generelle Lösung für dieses Problem erarbeitet werden, indem die
Import- und Export-Handler und das XML Format umgeschrieben werden. In diesem
Zuge wäre es auch möglich, die Validierung der exportierten XML Dokumente mit der
XML Toolbox selbst durchzuführen.
Zusammenfassend lässt sich sagen, dass die XML Toolbox eine Alternative zur Geodise
Toolbox bietet. Dabei ist sie voll kompatibel zu dieser, jedoch performanter was Lauf-
zeit und Speicherverbrauch angeht. Sie hat aber dieselben Probleme was die Struktur
mancher XML Dokumente betrifft. Diese können aber durch Erweiterungen behoben
werden, falls sich dies als notwendig erweist.
34
Literaturverzeichnis
[Con06] The Unicode Consortium. The Unicode Standard, Version 5.0. Addison-
Wesley Professional, 5th edition, November 2006. ISBN: 0321480910.
[W3C06] W3C. Extensible Markup Language (XML) 1.1 (Second Edition). Online,
September 2006. http://www.w3.org/TR/xml11/.
35
Abbildungsverzeichnis
36
Appendix A – Inhalt der CD
Die beiliegende CD enthält neben der XML Toolbox weitere Dokumente. Die Ver-
zeichnisstruktur sieht wie folgt aus:
+ Root
|— CMake
|— Expat
|— Manual
|— Testtools
|–+Thesis
| |— src
|
|–+XML Toolbox
| |— bin
| |— src
CMake Dieses Verzeichnis enthält die bei der Erstellung der XML Toolbox verwendete
CMake Version 2.4.7, als Windows 32 Setup und als Sourcecode.
Expat Dieses Verzeichnis enthält die verwendete Expat Version 2.0.1 als Sourcecode,
sowie kompiliert für Windows 32 und MacOS X.
Testtools Hier sind alle bei den Test verwendeten C++ und Matlab Programme ent-
halten, die in Appendix B erwähnt werden. Weiters enthält das Verzeichnis alle Testdo-
kumente.
37
Thesis\src Dieses Verzeichnis enthält den LATEX Source Code dieses Dokuments, so-
wie alle Originalbilder und Dokumente, die zur Erstellung dieses Dokuments verwendet
wurden.
Das Profilingprogramm “Process Explorer” ist nicht auf der CD enthalten. Kapitel 5.1
enthält die URL, unter der das Programm gratis vorzufinden ist. Bei allen anderen Kom-
ponenten von Drittanbietern ist ausdrücklich erlaubt, diese in Source- und Binärform zu
verteilen.
38
Appendix B – Programmteile
Alle Kombinationen dieser Werte werden als Parameter für die Wachstumsfunktion
getestet. Die resultierenden Funktionen werden mit drei Referenzgleichungen überprüft.
Diese sind
f (6, 0) = 0, 1 (1)
f (3, 5) = 1, 0 (2)
f (2, 5) = 3 (3)
Der Parameter ist dabei jeweils der log10 (s), wobei s die aktuelle Größe darstellt.
Gleichung 1 legt fest, dass das Wachstum bei 1.000.000 (106 ) bei 10% liegen soll. Glei-
chung 2 gibt die Grenze für Speicherverdoppelungen an, die bei ∼ 3.162 (103,5 ) liegen
soll. Gleichung 3 legt eine Vervierfachung des Speichers bei ∼ 316 (102,5 ) fest, damit der
Funktionswert für kleine Werte nicht zu schnell abnimmt.
Nur jene Wertepaare, die alle Gleichungen mit einer maximalen Abweichung von 0,1
lösen, werden in Betracht gezogen. Die Ergebnisse werden aufsteigend nach durchschnitt-
licher Abweichung sortiert und die besten drei Ergebnisse ausgegeben.
39
growth algorithm test
Dieses Testprogramm misst die Anzahl von Allokierungen, die bei der Verwendung
von verschiedenen Wachstumsfunktionen nötig sind, um bestimmte Datenmengen zu
allokieren. Es wird kein Speicher allokiert und stellt lediglich eine Simulation dar. Es wird
die Anzahl der Allokierungen, die endgültig allokierte Datenmenge, und die Abweichung
von der gewünschten Datenmenge ausgegeben. Es werden die Datenmengen 100, 1.000,
100.000, 1.000.000 und 3.000.000 getestet.
Es werden drei Wachstumsfunktionen getestet. Die erste ist grow fv, für ein Wachstum
um einen konstanten Wert (100). Die zweite Funktion grow ff multipliziert die aktuelle
Größe mit einem konstanten Wert (2, für Verdoppelung). Die letzte ist grow wb, für den
dynamischen Weibull Faktor. Alle Funktionen erhalten die aktuelle Größe als Eingabe,
und geben den Wert 10 zurück, wenn diese 0 ist.
compare
t = compare(s1, s2, [file, tol])
1
siehe http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=3449 (Stand
31.7.2007)
40
createCell
a = createCell(ct, dim1, dim2)
Erzeugt ein Cell-Array mit ct Zellen. Jede Zelle enthält eine Double-Matrix der Größe
dim1 x dim2, gefüllt mit zufälligen Werten. Diese Funktion wird in mehreren Testfällen
verwendet.
createDS
a = createDS(NUM)
Erzeugt NUM Strukturen mit Feldern aller unterstützter Datentypen. Die Strukturen
haben folgende Form:
Diese Struktur enthält sehr große Felder (matrix[1-3]) und eignet sich daher auch
für Auslastungstests. Die Funktion wird in mehreren Testfällen verwendet. Sie wurde
von Thomas Ludescher und Thomas Geiger (FHV) zur Verfügung gestellt.
41
time measure
t = time measure(e, [count])
xml test
[c,texp,timp] = xml test(value, [tol], [count], [fname], [exp arg], [imp arg],
[encoding])
Führt einen Testlauf der XML Toolbox aus. Exportiert den Wert value in eine Da-
tei und Importiert diese wieder. Der importierte Wert wird mittels compare mit dem
Originalwert verglichen. Die Funktion hat folgende zusätzliche optionale Parameter:
• fname: Dateiname für die XML-Datei. Platzhalter %d wird durch die Laufnummer
ersetzt
• encoding: Dateikodierung
Wenn value in einfachen Anführungsstrichen steht, wird der Ausdruck vor jedem
Testlauf erneut ausgewertet.
42
Appendix C – Testfälle und -ergebnisse
1. Funktionalitätstests
Test 1a: Genauigkeit Fließkommazahlen (10−10 )
Testfall
xml test(’rand(10, 10);’, 1e-10, 10)
Beschreibung
Exportiert zehn mal eine zufällige 10x10 Fließkommazahlmatrix. Die Zufallswerte wer-
den bei jedem Export neu ermittelt. Die Zahlen werden mit einer Toleranz von 10−10
verglichen.
Ergebnis
Alle Zahlen wurden innerhalb der Toleranz korrekt exportiert und importiert.
Beschreibung
Exportiert zehn mal eine zufällige 10x10 Fließkommazahlmatrix. Die Zufallswerte wer-
den bei jedem Export neu ermittelt. Die Zahlen werden mit einer Toleranz von 10−14
verglichen.
Ergebnis
Alle Zahlen wurden innerhalb der Toleranz korrekt exportiert und importiert.
43
Test 1c: Genauigkeit Fließkommazahlen (10−15 )
Testfall
xml test(’rand(10, 10);’, 1e-15, 10)
Beschreibung
Exportiert zehn mal eine zufällige 10x10 Fließkommazahlmatrix. Die Zufallswerte wer-
den bei jedem Export neu ermittelt. Die Zahlen werden mit einer Toleranz von 10−15
verglichen.
Ergebnis
Innerhalb der Toleranzgrenze weichen die meisten Zahlen von den Originalzahlen ab.
Beschreibung
Erzeugt eine 1.000x1.000 Matrix, die ein magisches Quadrat bildet1 . Alle Werte > 50
werden durch 0 ersetzt. m wird negiert und die Quadratwurzel wird gezogen. Dadurch
werden alle Elemente 6= 0 imaginäre Zahlen. m wird in eine dünnbesetzte Matrix (engl.
sparse matrix) umgewandelt.
Ergebnis
Alle Zahlen wurden innerhalb der Toleranz korrekt exportiert und importiert. Die ver-
schachtelten XML Elemente werden korrekt zu Elementen der komplexen Matrix und
der dünnbesetzten Matrix importiert.
1
siehe http://en.wikipedia.org/wiki/Magic square
44
Test 1e: Test aller Datentypen
Testfall
xml test(createDS(1))
Beschreibung
Erzeugt eine Struktur, die Objekte aller unterstützten Matlab-Datentypen enthält (siehe
Appendix B, “createDS”). Exportiert und importiert diese Struktur.
Ergebnis
Die Strukturen haben dieselbe Form (Felder, Feldtypen). Die Felder haben dieselben
Dimensionen und Inhalte, innerhalb der gegebenen Standardtoleranz (für Fließkomma-
zahlen).
Beschreibung
Testet XML-Elemente mit Namespaces und mit Elementnamen, die in Matlab nicht
gültig sind (Attributefelder NAMESPACE und TAGNAME).
Ergebnis
Die importierten Strukturen sind identisch. Die erzeugte XML-Datei ist äquivalent zur
Originaldatei.
45
Test 2b: Realdaten mit Kommentaren
Testfall
slideSample05.xml
Beschreibung
Diese XML-Datei beinhaltet hauptsächlich Textdaten und Kommentare. Es handelt sich
dabei um kein konstruiertes Beispiel, sondern wurde aus dem Unterrichtsmaterial zum
Kurs “Datenmanagement” entnommen. Es wurden kleine Änderungen vorgenommen
(Streichung von CDATA und Processing Instructions).
Ergebnis
Die importierten Strukturen sind identisch. Die erzeugte XML-Datei unterscheidet sich
von der Originaldatei. Kommentare gehen verloren. Unterelemente werden alphabetisch
sortiert ausgegeben.
Beschreibung
Dieses XML-Dokument enthält Elemente, die sowohl weitere Unterelemente, als auch
Textinhalt besitzen. Dieses Dokument wurde ebenfalls aus dem Unterrichtsmaterial zum
Kurs “Datenmanagement” entnommen.
Ergebnis
Die importierten Strukturen sind identisch. Die erzeugte XML-Datei unterscheidet sich
von der Originaldatei. Der Textinhalt bei Elementen mit Unterelementen wird nicht im-
portiert und somit nicht wieder ausgegeben. Unterelemente werden alphabetisch sortiert
ausgegeben.
46
Test 2d: Größeres XML Dokument mit Textblöcken
Testfall
recipes2.xml
Beschreibung
Dieses XML Dokument enthält Elemente mit längeren Textblöcken. Es wurde aus dem
Unterrichtsmaterial zum Kurs “Datenmanagement” entnommen.
Ergebnis
Die importierten Strukturen sind identisch. Ignorierbare Leerzeichen bleiben erhalten,
Zeilenumbrüche gehen verloren. Die erzeugte XML-Datei unterscheidet sich von der Ori-
ginaldatei. Der Textinhalt wird in einer Zeile mit zusätzlichen Leerzeichen ausgegeben.
Unterelemente werden alphabetisch sortiert ausgegeben.
3. Zeittests
Test 3a: Struktur mit großen Feldern
Testfall
xml test(createDS(1), 1e-5, 10)
Beschreibung
Hier wird wiederholt eine Struktur mit großen Feldern exportiert und importiert. Größe
der Struktur in Matlab ist 7,86 MiB2 .
Ergebnis
Alle importierten Strukturen waren identisch mit der Originalstruktur.
2
1 MiB (Mebi Byte) ≡ 220 = 1.0242 = 1.048.576 Bytes
47
Test 3b: Struktur mit mehreren großen Feldern
Testfall
xml test(createDS(3), 1e-5, 10)
Beschreibung
Hier werden drei Strukturen mit großen Feldern erzeugt und getestet. Größe der Struktur
in Matlab ist 23,58 MiB.
Ergebnis
Alle importierten Strukturen waren identisch mit der Originalstruktur.
Beschreibung
Hier wird ein Cell-Array mit 1.000 Zellen erstellt, die jeweils eine zufällige 10x10 Double-
matrix darstellen. Größe der Struktur in Matlab ist 0,82 MiB.
Ergebnis
Alle importierten Strukturen waren identisch mit der Originalstruktur.
48
Test 3d: 100.000 kleine Objekte
Testfall
xml test(createCell(100000, 10, 10))
Beschreibung
Hier wird ein Cell-Array mit 1.000 Zellen erstellt, die jeweils eine zufällige 10x10 Double-
matrix darstellen.
Ergebnis
Out of Memory Exception bei der Erstellung des Cell-Arrays in Matlab.
Zusammenfassung
4. Speichertests
Bei diesen Tests kann die xml test Funktion nicht verwendet werden, da die Import-
und Exportoperationen direkt aufeinander folgen. Somit ist eine Unterscheidung, wel-
che Operation wieviel Speicher verwendet, nur schwer möglich. Stattdessen wurden die
Operationen getrennt ausgeführt. Der Export schreibt eine XML-Datei, die beim Import
wieder eingelesen wird.
Diese Tests wurden auf zwei Arten durchgeführt. Zuerst wurden Typinformationen
mitexportiert. Der Importprozess weiß somit, wieviel Speicher für die einzelnen Objekte
bereitgestellt werden muss. Bei der zweiten wurden keine Informationen exportiert, und
der Importprozess soll numerische Inhalte zu Double Matrizen konvertieren. Bei dieser
Variante muss dynamisch ermittelt werden, wieviel Speicher benötigt wird. Es kommt
die Wachstumsfunktion der MemoryVector Klasse zum Einsatz (siehe Kap. 3.2).
49
Als Ergebnis wird der Speicherverlauf der jeweiligen Operation angegeben. Es wird
die Speicherbelegung des Matlab-Prozesses zu Beginn der Operation (Start), nach Be-
endigung der Operation (Ende), und der Höchstwert während der Operation (Hoch) an-
gegeben. Zusätzlich wird angegeben, um wieviel der Höchstwert den Speicherverbrauch
am Ende übersteigt. Dies ist die zusätzliche Speicherbelastung durch die Operation.
Angegeben wird auch die Durchführungszeit der Operation.
Beschreibung
Hierbei wird ein Cell-Array mit 1.000 Zellen erzeugt, wobei jede Zelle eine zufällige 10x10
Doublematrix ist. Größe des Arrays in Matlab ist 0,82 MiB.
Ergebnis
Start (MiB) Ende (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
Export 28,5 28,5 28,5 0,0 0,82
Import statisch 28,5 29,5 29,5 0,0 0,26
Import dynamisch 28,4 30,9 30,9 0,0 0,37
Beschreibung
Hierbei wird ein Cell-Array mit 10.000 Zellen erzeugt, wobei jede Zelle eine zufällige
10x10 Doublematrix ist. Größe des Arrays in Matlab ist 8,20 MiB.
50
Ergebnis
Start (MiB) Ende (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
Export 45,3 45,2 45,8 0,6 8,20
Import statisch 38,9 49,9 49,9 0,0 4,08
Import dynamisch 39,1 65,4 65,4 0,0 7,86
Beschreibung
Es wird mit einer Struktur getestet, die Felder aller unterstützten Datentypen bein-
haltet. Einige Felder sind sehr groß (≥ 100.000 Elemente) und werden die dynamische
Wachstumsfunktion in Anspruch nehmen. Die Größe der Struktur in Matlab ist 7,86
MiB.
Ergebnis
Start (MiB) Ende (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
Export 36,9 37,9 85,4 47,5 8,17
Import statisch 37,9 45,8 45,8 0,0 2,27
Import dynamisch 38,0 46,8 74,0 27,2 2,62
Beschreibung
Es wird mit drei Strukturen getestet, die Felder aller unterstützten Datentypen bein-
haltet. Einige Felder sind sehr groß (≥ 100.000 Elemente) und werden die dynamische
Wachstumsfunktion in Anspruch nehmen. Die Größe der Struktur in Matlab ist 23,58
MiB.
51
Ergebnis
Start (MiB) Ende (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
Export 53,7 53,7 101,1 47,4 24,29
Import statisch 53,7 77,4 77,5 0,1 6,71
Import dynamisch 53,9 78,5 121,8 43,3 7,52
Es war eindeutig zu sehen, dass die Speicherauslastung während des Exports drei mal
von 53,7 auf 101,1 MiB stieg und wieder auf 53,7 MiB absank.
Beschreibung
Hier wird eine zufällige Doublematrix mit 3.000.000 Elementen erzeugt. Die dynamische
Speicherermittlung wird verwendet. Die Größe der Matrix in Matlab ist 22,89 MiB.
Ergebnis
Start (MiB) Ende (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
Export 53,0 53,0 159,7 106,7 23,44
Import statisch 53,0 75,9 76,5 0,6 6,50
Import dynamisch 55,1 77,7 177,3 99,6 7,67
Beschreibung
Hier wird eine zufällige Doublematrix mit 10.000.000 Elementen erzeugt. Die dynamische
Speicherermittlung wird verwendet. Die Größe der Matrix in Matlab ist 76,29 MiB.
52
Ergebnis
Start (MiB) Ende (MiB) Hoch (MiB) Überschuss (MiB) Zeit (s)
Export 102,3 103,1 703,6 600,5 105,24
Import statisch 103,1 179,5 179,5 0,0 25,61
Import dynamisch 25,9 104,7 638,7 534,0 26,94
Zusammenfassung
Dieselben Testfälle wurden ebenfalls mit der Geodise Toolbox durchgeführt. Die von
Geodise importierten XML-Dokumente enthielten alle Typinformationen. In der nach-
folgenden Tabelle können die Ergebnisse beider Toolboxen verglichen werden.
53
Export Export Geodise Import statisch Import dynamisch Import Geodise
Ü (MiB) t (s) Ü (MiB) t (s) Ü (MiB) t (s) Ü (MiB) t (s) Ü (MiB) t (s)
Test 4a 0,0 0,82 18,0 18,16 0,0 0,26 0,0 0,37 13,2 3,87
Test 4b 0,6 8,20 28,5 —1 0,0 4,08 0,0 7,86 149,6 31,33
Test 4c 47,5 8,17 217,3 10,30 0,0 2,27 27,2 2,62 1.285,2 —1
Test 4d 47,4 24,29 652,0 38,70 0,1 6,71 43,3 7,52 1.586,3 —2
54
Test 4e 106,7 23,44 633,1 171,71 0,6 6,50 99,6 7,67 579,9 333,66
Test 4f 600,5 105,24 384,4 —3 0,0 25,61 534,0 26,94 1.303,8 106,764
1
Nach 5 Minuten abgebrochen
2
Nach 10 Minuten abgebrochen
3
Nach ∼30 Sekunden abgestürtzt
4
Mit Out of Memory Exception abgebrochen