Performance

Sehr schnelles Verarbeiten großer Xml-Dateien

Die <xml>cmp-tools sind optimiert für das Verarbeiten großer Xml-Dateien. Sie sind sehr schnell und benötigen nur wenig Hauptspeicher.

Die Performance hängt von der jeweiligen Hardwarekonfiguration ab.

Auf dieser Seite folgen viele Performance-Messungen.

Beispiel:
Der Vergleich zweier 1.400 MB großen Xml-Dateien dauert nur 6 Minuten.
(Konfiguration: AMD Opteron Processor 248, 2 Prozessoren, 7 GB Speicher, 2 RAID-10-Plattensysteme)

Parameter

Folgende Parameter sind wichtig für eine gute Performance:

  • Anzahl der CPU's
  • Geschwindigkeit der CPU's
  • Geschwindigkeit der Platten
  • Hauptspeichergröße

Erläuterungen:
Beim Vergleichen oder Mischen von Xml-Dateien wird mit mehreren Threads gearbeitet. Mehr Prozessoren verbessern daher die Performance.
Die Geschwindigkeit der Platten ist sehr wichtig, da die Daten bis zu dreimal in temporäre Dateien geschrieben bzw. umsortiert werden.
Für das Verarbeiten großer Dateien ist kein großer Hauptspeicher erforderlich. Aber ein großer Hauptspeicher kann große Teile des Dateisystems puffern, was sich sehr positiv auf die Performance auswirken kann.

Die Erhöhung des Java-Heap-Size-Parameters mag eine Performance-Verbesserung bringen - aber nur von wenigen Prozentpunkten.(Siehe unten stehende Messungen)

Hardwarekonfigurationen

Mit diesen Hardwarekonfigurationen wurden die Tests durchgeführt.

A B C
System Linux 2.6.9-22.0.2.106 unsupportedsmp #1 SMP Linux 2.4.21-27.0.2.ELsmp #1 SMP Linux 2.4.20-4GB unter Vmware
Cpu AMD Opteron(tm) Processor 248 AMD Opteron(tm) Processor 244 Intel(R) Pentium(R) 4 CPU 2.66GHz
Cpu MHZ 2190.584 1792.254 2659.303
Cpu Cache-Grösse KB 1024 1024 512
Prozessoren 2 2 1
Hauptspeicher KB 8.030.056 7.956.884 514.952


Um eine Vorstellung von der Performance der jeweiligen oben genannten Hardwarekonfigurationen zu bekommen, sind hier die Zeiten für das Kopieren und Sortieren von Dateien protokolliert.

Kopieren von Dateien:

Dateigröße MB A B C
100 MB 1s 2s 3s
300 MB 5s 5s 24
700 MB 11s 22s 48s
1400 MB 23s 1m40s 1m56s

Sortieren von Dateien:

Die Zeiten für das Sortieren sind relativ hoch. Ursache hierfür ist: Die Dateien sind Xml-Dateien. In jeder Zeile steht immer nur ein einzelnes Element. Da die einzelnen Zeilen somit nicht sehr signifikant sind, ist der Sortieraufwand relativ hoch.

Dateigröße MB Zeilen A B C
100 MB 2.752.921 2m22s 2m23s 18s
300 MB 8.260.808 7m51s 8m01s 1m23s
700 MB 19.929.075 19m10s 21m14s 3m30s
1400 MB 39.858.146 40m12s 44m37s 1h40m47s


Performance-Messungen

Die folgenden Messungen basieren alle auf folgender Basissteuerungs-Datei:

Basissteuerungs-Datei:
<?xml version="1.0" encoding="UTF-8"?>
<delivery>
    <list_person>
        <person ident_att_id="true">
            <name cmp_text="true" />
            <firstname cmp_text="true" />
            <typ cmp_text="true" />
            <output cmp_text="true" />
            <id cmp_text="true" />
            <valid_since cmp_text="true" />
            <valid_until cmp_text="true" />
            <timestamp cmp_text="true" />
            <delivery_id cmp_text="true" />
            <status cmp_text="true" />
            <list_address>
                <adress ident_att_id="true">
                    <residence cmp_text="true" />
                    <street cmp_text="true" />
                    <hausno cmp_text="true" />
                </adress>
            </list_address>
        </person>
    </list_person>
</delivery>

Beispielsinhalt der Testdateien:
<?xml version="1.0" encoding="UTF-8"?>
<delivery>
    <list_person>
        <person id="1">
            <name>Baker</name>
            <firstname>John</firstname>
            <typ>P</typ>
            <output>Dr. John Baker</output>
            <id>1</id>
            <valid_since>2000-12-01</valid_since>
            <valid_until>2003-01-01</valid_until>
            <timestamp>2001-01-01-00.00.00.000000</timestamp>
            <delivery_id>345</delivery_id>
            <status>U</status>
            <list_address>
                <adress id="1">
                    <residence>New York</residence>
                    <street >Dr. Smith Street</street >
                    <hausno >23</hausno >
                </adress>
                <adress id="2">
                    <residence>Detroit York</residence>
                    <street >Michigan Street</street >
                    <hausno >43</hausno >
                </adress>
            </list_address>
        </person>
    </list_person>
</delivery>


Vergleichen von Xml-Dateien

Dateigröße MB Zeilen Anzahl Xml-
Differenzen
A B C
100 2.752.921 2 28s 35s 1m49s
300 8.260.808 3 44s 1m14s 7m09s
700 19.929.075 5 3m01s 6m20s 19m47s
1400 39.858.146 2 5m56s 13m40s 48m22s


Sortieren von Xml-Dateien

Die Testdateien sind sortiert nach "person@id". Sie sollen nun umsortiert werden nach: "name", "firstname", "residence"


Sortiersteuerungs-Datei:
<?xml version="1.0" encoding="UTF-8"?>
<sort>
    <identity path='/delivery/list_person/person' >
        <identityfield path='/name' sort='+' />
        <identityfield path='/firstname' sort='+' />
        <identity path='/list_address/address' >
            <identityfield path='/residence' sort='+' />
        </identity>
    </identity>
</sort>

Dateigröße MB A B C
100 1m15s 1m34s 3m32s
300 3m39s 4m31s 10m36s
700 8m59s 11m8s 26m42s
1400 18m11s 21m40s 55m11s


Mischen von Xml-Dateien

Die oben genannten Testdateien der verschiedenen Grössen-Klassen weisen jeweils nur wenige Unterschiede auf. Diese Testdateien werden nun miteinander gemischt. Die Mischregeln sind: Das Ergebnis soll alle Sätze von beiden Dateien enthalten. Wenn bei einem Satz bei einem Element abweichende Werte festgestellt werden, soll der Wert von Datei2 den Wert von Datei1 überschreiben.

Mischsteuerungs-Datei:
<?xml version="1.0" encoding="UTF-8"?>
<merge>
    <identity path='/lieferung/liste_kv_person/kv_person' merge='333' >
        <value path='/id' merge='3332' />
        <value path='/vorname' merge='3332' />
        <value path='/kz_typ_person' merge='3332' />
        <value path='/gueltig_bis' merge='3332' />
        <value path='/ausgabe' merge='3332' />
        <value path='/gueltig_von' merge='3332' />
        <value path='/aend_zeitstempel' merge='3332' />
        <value path='/name' merge='3332' />
        <value path='/vs_lieferant_id' merge='3332' />
        <value path='/kz_aktiv' merge='3332' />
        <identity path='/liste_kv_pers_adresse/kv_pers_adresse' merge='333' >
            <value path='/wohnort_name' merge='3332' />
            <value path='/hsnr' merge='3332' />
            <value path='/strassenab_name' merge='3332' />
        </identity>
    </identity>
</merge>
</delivery>

Dateigröße MB A B C
100 1m11s 1m47 3m56s
300 3m27s 5m13s 13m52s
700 8m25s 14m15s 33m33s
1400 17m30s 31m51s 59m40s


Umgruppieren von Xml-Dateien

Für die Performancemessungen werden die Daten der Testdateien umgruppiert in eine Struktur, welche alle Orte enthält, zu jedem Ort die Strassen, zu jeder Strasse die Hausnummern und schließch zu jeder Hausnummer die zugehörigen Personen.

Konvertierungssteuerungs-Datei:
<?xml version="1.0" encoding="UTF-8"?>
<delivery>
    <list_residence>
        <residence ident_att_name="true" path_text="/delivery/liste_person/person/list_address/address/residence">
            <list_street>
                <street ident_att_name="true" path_att_name="/delivery/list_person/person/list_address/address/street">
                    <list_hsnr>
                        <hsnr ident_att_nr="true" path_att_nr="/delivery/list_person/person/list_address/address/hsnr">
                            <list_person>
                                <person ident_att_id="true" path_att_id="/delivery/list_person/person/@id">
                                    <name ident_text="true" />
                                    <firstname ident_text="true" />
                                    <typ ident_text="true" />
                                    <output ident_text="true" />
                                    <id ident_text="true" />
                                    <valid_since ident_text="true" />
                                    <valid_until ident_text="true" />
                                    <timestamp ident_text="true" />
                                    <delivery_id ident_text="true" />
                                    <status ident_text="true" />
                                </person>
                            </list_person>
                        </hsnr>
                    </list_hsnr>
                </street>
            </list_street>
        </residence>
    </list_residence>
</delivery>

Beispiel für konvertierte Daten :
<?xml version="1.0" encoding="UTF-8"?>
<delivery>
    <list_residence>
        <residence name="New York">
            <list_street>
                <street name="Dr. Smith Street">
                    <list_hsnr>
                        <hsnr nr="23">
                            <list_person>
                                <person id="1">
                                    <name>Baker</name>
                                    <firstname>John</firstname>
                                    <typ>P</typ>
                                    <output>Dr. John Baker</output>
                                    <id>1</id>
                                    <valid_since>2000-12-01</valid_since>
                                    <valid_until>2003-01-01</valid_until>
                                    <timestamp>2001-01-01-00.00.00.000000</timestamp>
                                    <delivery_id>345</delivery_id>
                                    <status>U</status>
                                </person>
                            </list_person>
                        </hsnr>
                    </list_hsnr>
                </street>
            </list_street>
        </residence>
        <residence name="Detroit">
            <list_street>
                <street name="Michigan Street">
                    <list_hsnr>
                        <hsnr nr="43">
                            <list_person>
                                <person id="1">
                                    <name>Baker</name>
                                    <firstname>John</firstname>
                                    <typ>P</typ>
                                    <output>Dr. John Baker</output>
                                    <id>1</id>
                                    <valid_since>2000-12-01</valid_since>
                                    <valid_until>2003-01-01</valid_until>
                                    <timestamp>2001-01-01-00.00.00.000000</timestamp>
                                    <delivery_id>345</delivery_id>
                                    <status>U</status>
                                </person>
                            </list_person>
                        </hsnr>
                    </list_hsnr>
                </street>
            </list_street>
        </residence>
    </list_residence>
</delivery>

Dateigröße MB A B C
100 1m40s 1m50s 5m1s
300 5m00s 6m30s 15m33s
700 12m38s 15m50s 38m22s
1400 24m05s 28m56s 1h15m10s


Schnelle Platten verbessern Performance

Die Performance der Platten ist entscheidend, weil die Dateien mehrmals in temporäre Dateien geschrieben werden. Man kann bis zu vier temporäre Verzeichnisse für diese Dateien definieren über die Shellvariablen TMPDIR, TMPDIR1, TMPDIR2 und TMPDIR3. Beste Performanceergebnisse erhält man, wenn die temporären Verzeichnisse auf verschiedenen Dateisystemen liegen, die jeweils getrennte Plattensteuerungen haben.



Geringer Einfluß des Java-Heap-Size-Parameters

Das Erhöhen des Java-Heap-Size-Parameters bringt nur relativ wenige Performance-Vorteile. Auch mit sehr geringer Java-Heap-Size können gute Performanceergebnisse erzielt werden.

.

Bei den folgenden Messungen wurden zwei XML-Dateien verglichen, die jeweils 700 MB groß sind und zwischen denen zwei Abweichungen bestehen. Der maximale Java-Heap-Size-Wert wurde über Schalter "-Xmx" explizit vorgegeben.

Java-Heap-Size A
50 MB 3m01s
100 MB 2m55s
250 MB 3m01s
500 MB 2m55s
1000 MB 3m00s
2000 MB 2m49s
Logo SOFIKA GmbH

<xml>cmp-Werkzeugkasten

  • Vergleichen von Xml-Dateien
  • Mischen von Xml-Dateien
  • Umgruppieren von Xml-Dateien
  • Sortieren von Xml-Dateien

<xml>cmp und große Xml-Dateien

  • designed für große Xml-Dateien
  • wenig Hauptspeicherbedarf
  • sehr gute Performance

<xml>cmp-Aufrufmöglichkeiten

  • Unix/Dos-Kommandos
  • Java-Api

Differenzen werden im Context der Xml-Dateien dargestellt:

  • alle Daten + Differenzen
  • nur Differenzen
  • Darstellung: Xml und Pdf
Software Fischer SOFIKA GmbH
Freseniusstr. 65
D-81247 München
Deutschland
Tel: +49 (0)89 / 81 00 90 15
Fax: +49 (0)89 / 81 00 90 16
Email: info@sofika.de