Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Schnelle XML Lib für große Dateien gesucht (https://www.delphipraxis.net/132530-schnelle-xml-lib-fuer-grosse-dateien-gesucht.html)

alzaimar 16. Apr 2009 13:49

Re: Schnelle XML Lib für große Dateien gesucht
 
Bastel Dir deinen eigenen 'Extractor' (Parser kann man das dann nicht nennen), der über ein Sliding Window von z.B. 10MB (Hausnummer) über die Datei rudert und deine Daten aufsammelt.

Du hältst also immer 10MB der Datei im Speicher und sprichst diese als langen String an. WEnn Du bei 90% angelangt bist, verschiebst Du die noch nicht untersuchten 10% nach vorne und lädst dahinter die nächsten 90% rein*. Dann geht es quasi von Vorne wieder weiter. So harkst Du dich duch beliebig lange Dateien und bist auch noch schnell dabei.

* Die 10% sind nur ne Hausnummer. Der Gap hängt mit der zu suchenden/parsen Wortgröße zusammen und verhindert, das der erste Teil des zu suchenden Wortes ganz am Ende des Slidingwindows ist und so nicht gefunden werden würde.

Anstatt 10MB könnten 50 oder 100MB vielleicht günstiger sein. Das müsstest Du testen.

Mithrandir 17. Apr 2009 16:24

Re: Schnelle XML Lib für große Dateien gesucht
 
Moin alzaimar,

ja, ich denke, so werde ich das wohl machen. Wäre es eigentlich.. uhm... "unelegant" Delphi-Referenz durchsuchenReadLn zu verwenden und die Datei zeilenweise einzulesen? Zumindest bei der jetzigen API-Version liegen die Dateien immer mit Zeilenumbruch vor. Würde mir wieder ein paar Zeilen Code sparen.. ;)

//Edit: Mit ReadLN verarbeitet er die kleine Datei bei eingeschalteter Optimierung innerhalb von 10 Sekunden, für die große 4 GB Datei benötigt er gute 2 1/2 Minuten. Dann käme noch die Verarbeitung und das Schreiben in die SQL-DB dazu. Ich habs mitm FileStream zuerst versucht, und einem simplen Beispiel. Aber er hat mir nur Exceptions an den Kopf geschmissen, die mir zumindest nichts gesagt haben... :gruebel:

//Edit2: Gäbe es doch einen MySQL-Dump zum Download... :wall:

//Edit3: Ok, ignoriert meinen Geistesblitz mit ReadLN oben. Ich hatte eben die Erleuchtung bezgl. TFileStream. ;)

Muetze1 17. Apr 2009 19:17

Re: Schnelle XML Lib für große Dateien gesucht
 
Zitat:

Zitat von Daniel G
//Edit3: Ok, ignoriert meinen Geistesblitz mit ReadLN oben. Ich hatte eben die Erleuchtung bezgl. TFileStream. ;)

Da es grundlegend noch immer XML ist, kannst du alles mit TStream Nachfahren machen, da CR und LF völlig unerheblich sind in einer XML Struktur. Diese werden ignoriert (Ausnahme: innerhalb eines CDATA Wertes).

Mithrandir 17. Apr 2009 19:49

Re: Schnelle XML Lib für große Dateien gesucht
 
Ok,

danke für den Hinweis mit dem CDATA. Sollte wohl nie vorkommen, aber man kann ja nie wissen... ;)

himitsu 22. Mai 2009 12:05

Re: Schnelle XML Lib für große Dateien gesucht
 
ich wollte mir mal dieses NativeXML von SimDesign ansehn ... Post #15
nur existiert die verlinkte Seite nicht (Code 404)
und http://www.simdesign.nl bzw. http://simdesign.nl liefern nur leere Seiten

dann hab ich mal 'nen Test gestartet
Delphi-Quellcode:
fill TXMLFile with 4.000.000 nodes, save into and load this from a file
create:0  fill:413022  save:404106  free:3261
EXMLException: EXMLException (TXMLFile.ParsingTree):
invalid name

Error on byte position 655.447 ("<Node6850 name="fcxv")
create:0  load:157  free:0

fill TXMLDocument with 4.000.000 nodes, save into and load this from a file
...
6,9 Minuten um 1,98 GB RAM zu belegen und zum Erstellen von 4 Millionen solcher Knoten:
XML-Code:
<Node123456 name="fcxvysdfgcxvcx" vc1x3y="fcxvysdfgcxvcx>123456gfdxv234rf56dfgcvbf</Node123456>

Aber wurde ja auch schon erwähnt, daß eine DOM-Version für sowas nicht wirklich geeignet ist (obwohl meine Version 2 irgendwann mal wesendlich mehr verkraften wird und dennoch als DOM läuft)

Na gut, dann muß ich jetzt noch den Grund für diese Exception rausfinden und kann dann mal Testen was mein Code in seinem pseudo-SAX-Mode hinbekommt.
Das wird aber geschwindigkeitsmäßig nie an einen guten und reinen SAX-Parser rankommen können.

Zum Testen hab ich mir mal finland.osm (614 MB) geladen
[edit] OK, ich lad mir gleich nochmal 'ne kleinere Testdatei (das obere Beispiel mit 4.000.000 Knoten ergibt nur eine 386 MB-Datei ... da bekomm ich die 614 wohl nicht direkt geladen :nerd: )

Mithrandir 22. Mai 2009 12:10

Re: Schnelle XML Lib für große Dateien gesucht
 
Hi himi, Niedersachsen hat ungefähr 2 Mio. Nodes, noch vielleicht ne Mille anderer Knoten drauf. ;)

himitsu 22. Mai 2009 12:22

Re: Schnelle XML Lib für große Dateien gesucht
 
Blos mal so aus Interesse ... hast du eigentlich mal alles da runtergeladen und entpackt?

Wie groß mag das denn insgesamt sein? :shock:


ja und mal sehn ... Polen ist grad unterwegs (UMTS ist halt nicht unbedingt flott)

TurboMartin 22. Mai 2009 13:16

Re: Schnelle XML Lib für große Dateien gesucht
 
Zitat:

Zitat von himitsu
XML-Code:
<Node123456 name="fcxvysdfgcxvcx" vc1x3y="fcxvysdfgcxvcx>123456gfdxv234rf56dfgcvbf</Node123456>

Ist das richtig, dass hinter dem letzten Atribut das " fehlt?

himitsu 22. Mai 2009 13:30

Re: Schnelle XML Lib für große Dateien gesucht
 
ist falsch ... war 'nen Kopier-/Schreibfehler ... also das " ist schon da

hatte die Knotten per Hand direkt aus'm Quelltext
Delphi-Quellcode:
For i := 0 to 3999999 do Begin
  Node := XML.RootNode.Nodes.Add('Node' + IntToStr(i));
  Node.Attributes.Add('name', 'fcxvysdfgcxvcx');
  Node.Attributes.Add('vc1x3y', 'fcxvysdfgcxvcx');
  Node.Data := '123456gfdxv234rf56dfgcvbf';
zusammengesetzt, da ich diese 386 MB XML-Datei grad in keinem Texteditor laden konnte, um es zu kopieren :roll:

Mithrandir 22. Mai 2009 14:47

Re: Schnelle XML Lib für große Dateien gesucht
 
Zitat:

Zitat von himitsu
Blos mal so aus Interesse ... hast du eigentlich mal alles da runtergeladen und entpackt?

Naja, das sog. Planet-File ist mit bz2 gepackt ungefähr 6 GB groß, entpackt 5 - 10 mal so groß. Europa ist im Download 1,6 Gigabyte groß, entsprechend auch hier 5-10 mal.

Ja, sind schon ne Menge Rohdaten... ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr.
Seite 4 von 6   « Erste     234 56      

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