Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern? (https://www.delphipraxis.net/200475-endlich-mal-eine-schnelle-xml-komponente-gesucht-oder-selber-tippern.html)

hoika 24. Apr 2019 21:28

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?

blawen 24. Apr 2019 21:45

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.

hoika 24. Apr 2019 21:52

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.

hoika 24. Apr 2019 21:54

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

https://forums.embarcadero.com/messa...ssageID=657749

sh17 25. Apr 2019 07:38

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

http://www.kluug.net/oxml.php

Sehr flott

hoika 25. Apr 2019 07:49

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Danke.
Ich schau mir den mal an.

jaenicke 25. Apr 2019 08:20

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.

hoika 25. Apr 2019 08:27

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.

dummzeuch 25. Apr 2019 08:37

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:

https://stackoverflow.com/questions/...ader-in-delphi

hoika 25. Apr 2019 10:41

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
spaßig ist aber anders.

;)

Vielleicht schreibe ich mir doch was eigenes ...

jobo 25. Apr 2019 11:40

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.

Frickler 25. Apr 2019 12:11

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Wenns nur ums Lesen geht: http://www.destructor.de/xmlparser/index.htm.

freimatz 25. Apr 2019 12:23

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Zitat:

Zitat von hoika (Beitrag 1430935)
Vielleicht schreibe ich mir doch was eigenes ...

Warum?

hoika 25. Apr 2019 13:01

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.

peterbelow 25. Apr 2019 17:23

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Zitat:

Zitat von hoika (Beitrag 1430894)
Kennt jemand so eine Komponente?

Ich hab früher mal mit SAX for Delphi gearbeitet, hat sehr gut funktioniert. Das ist aber schon etliche Jahre her, keine Ahnung, ob der Kode mit modernen Delphi-Versionen noch funktioniert.

hoika 25. Apr 2019 17:34

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
ich teste mal die Links durch.

Unit-Tests sind mein bester Freund...

Luckie 25. Apr 2019 17:58

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Was ist denn mit himitsus XML Unit?

hoika 25. Apr 2019 18:11

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
ich suche noch nach einem aktuellen Download
himXML.pas 12.01.2010 ???

Luckie 25. Apr 2019 18:49

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Schreib ihn doch an.

jobo 26. Apr 2019 06:45

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?

hoika 26. Apr 2019 07:19

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.

haentschman 26. Apr 2019 07:22

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Zitat:

ich suche noch nach einem aktuellen Download
https://www.delphipraxis.net/130751-...-himix-ml.html
1. Post, ganz unten (Download)

PS: klein aber oho. 8-)

:?: himitsu ist wieder mal verschollen...

hoika 26. Apr 2019 07:27

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
Zitat:

ganz unten.
Ja, die hatte ich mir ja runtergeladen, waren aber von 2010.
Wie ich schon weiter oben geschrieben hatte.

haentschman 26. Apr 2019 07:31

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Eine neue neuere gibt es nicht. Funktioniert auch mit aktuellem Delphi.

hoika 26. Apr 2019 07:33

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
danke.

hans65 26. Apr 2019 08:08

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Ich hatte schon einmal den XMLParser (ALXmlDoc.pas )von https://github.com/Zeus64/alcinoe im Einsatz.
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.

jobo 26. Apr 2019 08:08

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>

sh17 26. Apr 2019 08:10

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Zitat:

Zitat von hoika (Beitrag 1430947)
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.

Ja, solltest Du Dir mal anschauen, ein SAX Parser arbeitet nun einmal eventbasiert. Aber so groß ist die Code-Umstellung dann nicht. OXml kann mit anonymen Methoden arbeiten. Da geht das alles in einem Rutsch.

hoika 26. Apr 2019 09:12

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
Zitat:

Mit dieser Struktur komme ich nur auf ca 1/5 der genannten Größe:
Hm ?

Zitat:

ein SAX Parser arbeitet nun einmal eventbasiert
Schon klar, ich bin ja lernfähig ;)

jobo 26. Apr 2019 09:15

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.

Klaus01 26. Apr 2019 09:18

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
.. wäre es eine Möglichkeit mit Hilfe von XSLT die von Dir benötigten Daten aus dem XML File zu extrahieren?

Grüße
Klaus

hoika 26. Apr 2019 09:23

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.

jobo 26. Apr 2019 09:45

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Zitat:

Zitat von hoika (Beitrag 1431027)
..das mit der Größe.
Das war nur so schnell dahingetippert.
Die Xml-Datei sieht komplett anders aus.
..

Ok, mich interessiert einfach ein realer Zeitvergleich gegen DB.
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.

hoika 26. Apr 2019 10:03

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.

Neutral General 26. Apr 2019 10:04

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

jobo 26. Apr 2019 10:09

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.

hoika 26. Apr 2019 10:15

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Hallo,
na, ganz offiziell.

ftp://ftp.kbv.de/ita-update/Stammdat...DEBM_V1.60.zip
Die Zip-Datei enthält eine alte Version der Xml-Datei im Unterverzeichnis XML (850_01.60_74_tf2017q4_nr1.xml).

jaenicke 26. Apr 2019 16:57

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Diese Alpha eines Registry Editors liest die .reg Dateien sehr schnell in eine interne Struktur ein.
Falls du es selbst versuchen möchtest, könnte dir das Ideen geben.

hoika 26. Apr 2019 17:11

AW: Endlich mal eine schnelle Xml-Komponente gesucht oder selber tippern?
 
Ähem,
RegEdit ?

jaenicke 26. Apr 2019 18:59

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 12:03 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf