XML Performance
-
Grüsse zusammen,
Ich hatte mal vor langem ein etwas grösseres Programm geschrieben für Häuserverwaltungen, um ehrlich zu sein, war es mein erstes grosses Projekt

Das Programm hat zugehörige binäre Dateien, welche die Daten der Häuser enthalten. Jetzt sollte es bald soweit sein, dass ich das Programm neu schreibe, bzw. habe sogar teilweise schon damit begonnen.Aus dem alten Programm habe ich die Erfahrung gezogen, dass sich ein Dateiformat über die Zeit verändern kann, was bei einem binären Format als sehr mühsam herausstellte, da die Daten einfach hintereinander gestapelt waren.
Des weiteren gab es manchmal gewisse Bugs, welche die Daten korrumpierten und die Files waren dann äusserst schwer zu korrigieren.
Und drittens war dann noch das Problem, dass andere Programme keinen Zugriff auf die Daten hatten, obwohl es manchmal ganz praktisch gewesen wäre.Aus diesem Grund habe ich mich jetzt eigentlich für XML entschieden, als neues Dateiformat. Allerdings kenne ich mich in XML noch nicht so aus, da ich es erst seit kurzem verwende und hätte ein paar Fragen, gerade was die Performance betrifft.
XML Daten zu schreiben ist weniger das Problem, das geht ja relativ schnell.
Allerdings XML Daten zu lesen, sehe ich irgendwo als einen Performancekiller. Bisher hatte ich allerdings auch noch nicht all zu grosse XML-Dateien zu behandeln, daher kann ich es wohl schlecht beurteilen.
Bisher habe ich XML Dateien immer mit einem SAX-Parser geparst und musste dabei dann immer unterscheiden, was für ein Tag nun kommt, wo ich den zuordne, bzw. was ich mache. Und da man keine Switch-Anweisung mit Strings machen kann, musste ich immer if-else if-else if-... machen.
Klar könnte man das etwas beschleunigen, indem man eine Map erstellen würde, bzw. sowas ähnliches wie ein DOM-Parser, nur hoffentlich vereinfacht. Aber auch das müsste zuerst erstellt werden und dann am Ende wieder gelesen, wodurch man wohl wieder gleich schnell wäre. Das frisst doch bei grossen Dateien eine enorme Zeit.Daher meine eigentlich nur vier Fragen:
Wie lest ihr XML-Dateien ein? Wie ordnet ihr die Daten in der XML-Datei den entsprechenden Objekten und Strukturen zu?
Ist XML auch für grössere Dateien sinnvoll? Oder gibt es dazu eine alternative, welche aber trotzdem die Eigenschaften von XML erfüllen (Standard/Lesbar/Programmunabhängig)?Vielen Dank im voraus!
Grüssli
-
Dravere schrieb:
Aus dem alten Programm habe ich die Erfahrung gezogen, dass sich ein Dateiformat über die Zeit verändern kann, was bei einem binären Format als sehr mühsam herausstellte, da die Daten einfach hintereinander gestapelt waren.
Das ist ja kein Problem von binär Formaten, sondern von dem binär Format, dass du gewählt hast! Man kann ja auch flexibel encodieren. Verbreitet für binäres encodieren ist zB ASN.1 oder eines der zahlreichen Binary XML-Formate (wie zB EBML).
Dravere schrieb:
Des weiteren gab es manchmal gewisse Bugs, welche die Daten korrumpierten und die Files waren dann äusserst schwer zu korrigieren.
Davor schützt dich auch XML (oder ein anderes allgemeines Format) nicht unbedingt. Da solltest du zB selbst Checksummen und ähnliches in das Format einbauen.
Dravere schrieb:
Allerdings XML Daten zu lesen, sehe ich irgendwo als einen Performancekiller.
Ist das einlesen der Daten wirklich ein Bottleneck für deine Anwendung? Allgemein hört sich das was du beschreibst eher danach an, als sei eine einbindbare Datenbank, so wie SQLite für dich interessanter.
-
rüdiger schrieb:
Das ist ja kein Problem von binär Formaten, sondern von dem binär Format, dass du gewählt hast! Man kann ja auch flexibel encodieren. Verbreitet für binäres encodieren ist zB ASN.1 oder eines der zahlreichen Binary XML-Formate (wie zB EBML).
Das es an meinem Format lag, dass ist mir schon klar. Was mich halt stört ist, dass wirklich niemand das Zeug lesen kann oder ohne Information rausfinden, was sich dort drin befindet, bzw. welches Format verwendet wurde.
Zudem machen mir die Verbreitung der Formate ein wenig sorge. Ich habe nun schon einiges über XML gesucht per Google, in Foren gelesen usw. Aber bin noch nie als Alternative auf diese Formate gestossen.
Ich möchte ja auch ein Format haben, welches andere ohne zusätzliches Wissen einfach einlesen können. Bei XML müssen sie sich nur das File anschauen und dank sinnvollen Tagnamen ist das ganze Format verständlich.rüdiger schrieb:
Davor schützt dich auch XML (oder ein anderes allgemeines Format) nicht unbedingt. Da solltest du zB selbst Checksummen und ähnliches in das Format einbauen.
Da verstehst du was falsch. Ich will mich mit dem XML-Format davor nicht schützen, sondern ich möchte eine einfache Möglichkeit haben, um den Fehler von Hand zu lösen.
Simples anschauliches Beispiel (Sehr einfaches Beispiel, dient nur zur Veranschaulichung!):
Ein Mieter hat ein Parkplatz. Der Parkplatz wird dem Mieter weggenommen, aber aus einem Bug, wird der Parkplatz nicht als frei markiert. Somit kann der Parkplatz nicht mehr zugordnet werden. Der Benutzer merkt davon nix und speichert ab. Voilà! Der Parkplatz kann nie mehr zugeordnet werden. Aber mit einem XML-Editor könnte ich den Wert wieder berichtigen und natürlich noch ein Patch erstellen, damit das Problem gelöst wird
rüdiger schrieb:
Ist das einlesen der Daten wirklich ein Bottleneck für deine Anwendung? Allgemein hört sich das was du beschreibst eher danach an, als sei eine einbindbare Datenbank, so wie SQLite für dich interessanter.
Ich weiss nicht ob es dies ist oder nicht, das frage ich ja euch *g*
Wie gesagt hatte ich bisher nur mit äusserst kleinen XML-Files gearbeitet und das bis jetzt nur in Java. Somit kann ich wirklich nix darüber in C++ sagen.
Eine Datenbank erscheint mir allerdings nicht als eine sinnvolle Lösung. Grundsätzlich biete eine DB viel zu viel, was ich gar nicht brauche. Ich benötige nur am Anfang ein einmaliges lesen aller Daten und am Ende ein einmaliges schreiben aller Daten. Also der User startet das Programm, liest die Daten ein, verarbeitet sie und speichert sie wieder. Wie im Writer, Calc oder irgendwelchen Spielen mit Spielständen oder sonst was
Ich glaube ich sollte auch noch was anderes klar stellen. Wir reden denke ich hier auch nicht über so grosse Datenmengen:
a) Es soll ein File für jedes Haus geben!
b) Ein Haus hat in meinem jetzigen binären Format 15-20 Kilobytes.Als XML ... keine Ahnung wie gross das sein würde. 1 Megabyte? 50 zusätzliche Bytes pro Byte? Ist das zu viel gerechnet, zu wenig? Ich weiss es nicht.
Ich hoffe aber, dass es ein wenig klarer wurde in welchem Bereich wir hier uns bewegen. Es geht hier nicht um tausende, geschweige um hunderte oder duzende Megabytes
Grüssli
-
ueber die geschwindigkeit wuerde ich mir bei deinen anforderungen keine gedanken machen.
erinnere mich dunkel an ein projekt fuer das ein performancetest bzgl. des parsens eines XML files mit .NET durchgefuehrt wurde, die haben da glaube ich 0.2 sekunden fuer ein 20 megabyte grosses file (schon im speicher) gebraucht, auf einem 1.5 GHz rechner.
wenn du das parsen einer fertigen library ueberlaesst sollte der speed kein problem sein.
ich wuerde sagen fuer dein vorhaben ist XML ideal.
-
Ich glaube das Beste wird sein, du probierst es einfach mal aus. Hol dir eine einfache Xml-Bibliothek (z.B. TinyXml) und bau in deine bestehende alte Version beim Speichern einen zusätzlichen Xml-Export ein (zum Test). Da siehst du dann ja die Größe der Datei und du kannst dir noch ein kleines Testprogramm zum Auslesen schreiben. Ich nehme an die Einlese-Routine soll unter ~5 Sekunden ablaufen, das müsste eigentlich funktionieren.
Zur Not baust du einen Fortschrittsbalken ein, da die Datei(en) eh nur einmal geladen werden, wäre auch eine kleine Wartezeit akzeptabel (auch wenn ich nicht damit rechne).Zweites edit: Da es bei deinen Dateien nicht auf die Größe ankommt, würde ich von Binary-Xml abraten.
-
Ok, mit TinyXML sieht das ganz angenehm aus. Testen kann ich es leider nicht, wäre ehrlich gesagt zu viel Aufwand und zwar den Aufwand mich zu beruhigen, wenn ich den sch**** Quellcode lesen muss, den ich damals geschrieben habe

Aber ist halt so beim lernen von C++, zuerst schreibt man und später programmiert man in C++.Aber wenn ich das von Loki lese, dann sehe ich da keine Probleme.
Vielen Dank für eure Hilfe!
Grüssli