Schnellstmögliche XML-Behandlung in Delphi für sehr große Dokumente

8

Ich brauche Empfehlungen, was ich in Delphi verwenden soll (ich benutze Delphi 2009), um sehr große XML-Dateien (z. B. 100 MB) so schnell wie möglich zu verarbeiten.

Ich muss das XML eingeben, auf die darin enthaltenen Daten zugreifen und sie aktualisieren und dann das geänderte XML erneut exportieren.

Ich hoffe, dass die Eingabe und Ausgabe innerhalb weniger Sekunden auf einer schnellen Windows-Maschine erfolgen kann.

Klärung. Ich erwarte, dass ich DOM verwenden muss, da der Zugriff auf die Datenstruktur für die Entwicklung von Berichten und Aktualisierungen der Daten wichtig ist, und ich brauche diese Funktionalität sehr schnell.

Die Eingabe erfolgt nur einmal für das Laden von Dateien und die Ausgabe nur für das Speichern von Dateien, normalerweise nur einmal beim Beenden. Diese sollten ebenfalls schnell sein, sind aber nicht so wichtig wie der In-Memory-Datenzugriff und die Aktualisierung.

Nach meinem Verständnis helfen die Parser von Drittanbietern nur bei der Eingabe und Ausgabe, nicht aber bei der Verwendung und Änderung der Daten, sobald sie in den Speicher geladen wurden. Oder irre ich mich damit?

    
lkessler 05.11.2008, 00:41
quelle

8 Antworten

8

Wenn ich Ihre Frage richtig verstanden habe, kennen Sie die Datenstruktur und Sie ändern Daten - nicht die XML-Struktur der Datei.

Unter dieser Bedingung und wenn die Leistung entscheidend ist , könnten Sie es mit direkter Textmanipulation versuchen - überspringen Sie das XML-Parsing.

Aus dem Stream lesen, einen schnellen Textsuchalgorithmus verwenden, z. Boyer-Moore , um Orte zu finden, an denen Sie Daten ändern, Änderungen vornehmen und Daten in einen anderen Stream ausgeben müssen.

Dies wäre ein Durchlauf, kein XML-Parsing, keine In-Memory-XML-Baumbildung.

    
zendar 05.11.2008, 08:24
quelle
5

SAX ist eine Überlegung wert, anstelle eines DOM-Parsers.

Mit DOM zahlen Sie den Overhead des Ladens des Dokuments, aber sobald geladene Daten können schnell zugegriffen und aktualisiert werden.

Mit SAX müssen Sie Handler für begin-element, end-element, usw. schreiben, aber Sie haben viel mehr Flexibilität bei dem, was Sie tun, während Sie weitermachen.

Auch wenn es Ihrer Situation wahrscheinlich nicht weiterhilft, ist SAX dort sehr nützlich, wo Sie suchen, weil Sie das Parsing jederzeit anhalten können. Sobald Sie gefunden haben, was Sie wollten, können Sie aufhören.

Wenn Ihr Programm nicht alle Daten analysiert haben muss, bevor es weiß, welche Änderungen vorgenommen werden müssen, könnten Sie SAX-Handler schreiben, die die Daten nur beim Lesen aktualisieren und anderweitig weitergeben, sodass die Daten eher gestreamt werden als alles in irgendeine Art von Speicherstruktur laden zu müssen. Dies würde die Lösung sehr skalierbar machen, da Sie Speicherbeschränkungen bei sehr großen Dateien nicht erreichen.

Für was es wert ist, verwende ich die MSXML DOM und SAX Parser. Man kann argumentieren, dass sie nicht die beste Leistung bringen, ich argumentiere, dass wahrscheinlich mehr Menschen daran arbeiten, sie zu verbessern, damit sie immer besser werden.

    
Richard A 05.11.2008 01:44
quelle
4

Ich bin sehr zufrieden mit NativeXML von SimDesign. Es enthält auch eine spezielle Version namens FastXML, die ich noch nicht getestet habe, aber es heißt, nun, schnell.

    
Uwe Raabe 05.11.2008 07:14
quelle
3

Sie können sich die DIHtmlParser-Komponente von The Delphi Inspiration ansehen . Es soll "extrem schnell sein, besonders wenn große Dateien geparst werden" und "auf modernen Rechnern steigt der Score auf mehr als 15 MB HTML-Daten pro Sekunde". Ich habe einige ziemlich gute Erfahrungen damit gemacht, obwohl ich es noch nie mit riesigen Dateien probiert habe.

    
onnodb 05.11.2008 01:36
quelle
2

Ich bin kein Spezialist, aber ich glaube, der Konsens ist, dass ein SAX-Parser viel effizienter sein wird als DOM ...

    
François 05.11.2008 00:56
quelle
1

Wenn Sie jemals einen ereignisgesteuerten SAX-Weg in Betracht ziehen, könnte die XML-Parser-Bibliothek recht praktisch sein.

    
utku_karatas 06.11.2008 11:38
quelle
0

Eine andere Möglichkeit, die ich gerade entdeckt habe, ist mit dem LMD ElPack-Paket , das ich gekauft habe Dazu gehört eine XML-Support-Bibliothek, von der sie sagen, dass sie "extrem schnell und vollständig Unicode-fähig ist und Ihren Exe-Dateien nur einen geringen Platzbedarf hinzufügt".

Betrachtet man die Quelle ihrer LMDXML.pas-Einheit, die im LMD 7-Paket (für Delphi 2009) enthalten ist, heißt es, dass der Code auf SimpleXML Release 8.0 (Juli 2006) -Code von Michail Vlasov basiert.

    
lkessler 07.11.2008 03:59
quelle
0

Wenn Sie nur direkte Manipulation brauchen, würde ich der Antwort von zendar zustimmen.

Was die DOM- oder SAX-Implementierung betrifft, würde ich DIXml empfehlen .

    
ErvinS 08.05.2009 07:11
quelle