![]() |
Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
ein schöner provokanter Titel ;) ich habe diverse Xml-Dateien (20-50 MB gross). Der Aufbau ist jeweils pro Datei fest vorgegeben, jeder Knoten ist in einer separaten Zeile (#13#10). Bei der Nutzung diverser Xml-Komponenten (JEDI NativeXml, MS-XML, TXMLDocument) habe ich immer das Problem, dass diese zeichenweise durch den ByteStream der Datei durchlaufen und dabei ihre internen Strukturen aufbauen. Das passt ja auch ganz gut, wenn die Struktur unbekannt ist, aber ist ziemlich langsam. Bsp. Eine Datei mit einer sehr einfachen Xml-Struktur dauert aufgrund der Anzahl der Elemente (~50.000) sehr lange. Baue ich das per StringList nach (ich kenne ja die einfache Struktur der Datei), dauert es statt der 30 Sekunden nur 0,5 Sekunden zum Laden der Daten. Wie gesagt: Ich kenne die einfache Struktur. Ich könnte jetzt für eine paar der Dateien eigene Lade-Implementationen bauen, oder es gibt eine schnellere Implementation für Xml-Dateien? Als Grundübel habe ich die lange Parser-Zeit und das Einsortieren in interne Strukturen erkannt (Quellcode hatte ich mir bei dem JEDI's angesehen). Schön wäre eine On-the-fly-Implementierung, die bei jedem Knoten alle Parent-Knoten mitliefert, und wo ich dann gezielt sagen könnte -> "Nehme ich und packe es in meine eigenen Strukturen". Kennt jemand so eine Komponente? |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Ich pers. nutze die Delphi eigene Komponente (TXMLDocument) und bin damit zufrieden.
Allerdings habe ich keine Erfahrung, mit so grossen Dateien. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
Danke, habe das oben gleich mal mit eingefügt ;) TXMLDocument benutzt ja idR MS-XML. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
was ich vorhin mit On-The-Fly meinte, war ein SAX-Parser, siehe auch hier etwa in der Mitte ![]() |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Also in diesem Fall sollte ein SAX-Parser genommen werden.
Und für XML nutze ich ![]() Sehr flott |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Danke.
Ich schau mir den mal an. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Wir benutzen auch Oxml, wodurch die Ladezeiten nur noch grob ein Zehntel so lang sind im Vergleich zum internen Parser von Delphi.
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
der interne Parser ist ja afaik MS-Xml. Klingt also erst mal gar nicht schlecht. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
MSXML als SAX-Parser ist nach meiner Erfahrung da am schnellsten. (Und ich habe mehr Erfahrung mit XML-Dateien einlesen als mir lieb ist ...)
Nachteil von MSXML ist allerdings, dass das Fehlerhandling eine Katastrophe ist (passenderweise ist die häufigste Fehlermeldung "Catastrophic Failure" ;-) ). Nur so als Beispiel, wie spaßig das sein kann: ![]() |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
spaßig ist aber anders. ;) Vielleicht schreibe ich mir doch was eigenes ... |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Oder Du schaust Dir mal an, wie man es mit SQL abfragt. Einige können das und sind dabei auch nicht lahm:
Oracle MS SQL Postgres ..? Das böte sich jedenfalls an, wenn solche Systeme sowieso "in der Nähe" sind. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Wenns nur ums Lesen geht:
![]() |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Zitat:
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
warum? Weil es bis zu 100 mal schneller ist. Es geht hier um 5 unterschiedliche Dateien, deren Struktur sich nicht ändert, die aber ziemlich groß sind (50-60 MB). Ich schaue mir die SAX-Bsp.- mal an. Der XmlParser (destructor) sieht ja nicht schlecht aus. Ich verstehe nur noch nicht, wie ich an die einzelnen Knoten rankomme. Bisher greife ich über NodeByName auf das interne DOM zu. Aber ich hatte es mir schon gedacht, das das eine komplette Code-Umstellung mit sich bringt. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Zitat:
![]() |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
ich teste mal die Links durch. Unit-Tests sind mein bester Freund... |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Was ist denn mit himitsus XML Unit?
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
ich suche noch nach einem aktuellen Download himXML.pas 12.01.2010 ??? |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Schreib ihn doch an.
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Kann man davon ausgehen, dass Du einmalig lädst, vorhälst und Datenteile dann gezielt (mapping/index/..) verarbeitest?
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
ja, davon kannst Du ausgehen. Ich fülle einmal eine eigene interne Struktur und benutze dann nur noch diese eigene interne Struktur. aktuell (Pseudocode): Xml.LoadFromFile; AdresseNode:= Xml.NodeByName('Person').NodeByName('Adresse'); Strasse:= AdresseNode.Value['Strasse']; HausNr:= AdresseNode.Value['HNr']; <Person> <Adresse> <Strasse V="Musterweg"/> <HNr V="3"/> </Adresse> </Person> Das Problem bei mir ist, das die Datei etwa 100.000 Zeilen hat und ich davon etwa 50.000 für mein Programm brauche. SAX würde da wohl wirklich helfen. Ich bin mir nur nicht sicher, wie das ablaufen soll. Ich probier es einfach aus. Noch mal zu eigenem Code. Die Struktur ist ja fix. Jeder Node ist in einer eigenen Zeile. Ich könnte die Datei in eine StringList laden, die dann einfach mit einer Schleife durchlaufen und mir dir einzelnen Personen zusammensuchen. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Zitat:
![]() 1. Post, ganz unten (Download) PS: klein aber oho. 8-) :?: himitsu ist wieder mal verschollen... |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
Zitat:
Wie ich schon weiter oben geschrieben hatte. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Eine neue neuere gibt es nicht. Funktioniert auch mit aktuellem Delphi.
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
danke. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Ich hatte schon einmal den XMLParser (ALXmlDoc.pas )von
![]() Bei meinen kurzen Tests war er schneller als das Delphi-eigene TXMLDocument. Ein zusätzlicher Vorteil war, dass die Komponente einen Mischbetrieb zwischen Sax und Dom unterstützt. Man konnte also eine Xml-Datei nur teilweise einlesen, z.B. bis zum Ende eines Hauptknotens, alles bequem im Dom auswerten und dann freigeben und mit dem nächsten Element fortsetzen. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Mit dieser Struktur komme ich nur auf ca 1/5 der genannten Größe:
Code:
<Person>
<Adresse> <Strasse V="Bahnhofstr."/> <HNr V="68"></HNr> </Adresse> </Person> |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Zitat:
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
Zitat:
Zitat:
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Obige Struktur mal 100000 "Datensätze" z.B. ergibt bei mir eine Datei von ca 10 MB Größe. Die Struktur ist also unvollständig, oder es gibt ein Missverständnis, jedenfalls ist ein tatsächlicher Zeitvergleich damit nicht möglich.
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
.. wäre es eine Möglichkeit mit Hilfe von
![]() Grüße Klaus |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
ah, so meinst du das mit der Größe. Das war nur so schnell dahingetippert. Die Xml-Datei sieht komplett anders aus. Deshalb auch das Pseudocode. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Zitat:
Vielleicht kannst du per copy/paste einen tatsächlichen Satz zur Verfügung stellen und das nach Bedarf anonymisieren. Ich gehe zumindest mal davon aus, das Brutto/Netto Datenverhältnis und die durchschnittliche oder übliche Verschachtelungstiefe bei soetwas dann schon eine Rolle spielen. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
nein, die realen Daten darf ich nicht rausgeben (KBV = Kassenärztliche Bundesvereinigung), anonymisieren würde eine Menge Zeit erfordern. Ich baue das ganze mal in meine Unit-Tests ein. Dann sehe ich ja, ob und wie viel schneller es ist. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Er wollte ja keine ganze Datei sondern nur einen (anonymisierten) Datensatz, bzw. die Struktur
|
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Schade, eine Beispiel Adresse zu anonymisieren ist so viel Aufwand? Es geht ja nur um eine exemplarische Struktur. Multiplizieren kann ich die allein.
Wenn es ein offizielles Format ist, könntest Du natürlich auch die Definition verlinken. Aber wahrscheinlich ist es proprietäres Zeug, wie ich die kenne. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Hallo,
na, ganz offiziell. ![]() Die Zip-Datei enthält eine alte Version der Xml-Datei im Unterverzeichnis XML (850_01.60_74_tf2017q4_nr1.xml). |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Diese
![]() Falls du es selbst versuchen möchtest, könnte dir das Ideen geben. |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Ähem,
RegEdit ? |
AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
Es geht ja darum schnell eine Datei zu parsen, das müsste natürlich für deine Daten entsprechend anders gemacht werden. Aber z.B. die Verwendung von MMFs könntest du dir dort anschauen. Eine 400 MiB Registrydatei wird auf meinem aktuellen PC in nicht einmal 2 Sekunden (ich habe es nicht genau gemessen) eingelesen und angezeigt...
// EDIT: Es sind 1,45 Sekunden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz