Frage

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

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

Hoffentlich kann der Eingang und die Ausgabe innerhalb weniger Sekunden auf einem schnellen Windows -Computer erfolgen.


Klärung. Ich gehe davon aus, dass ich DOM verwenden muss, da der Zugriff auf die Datenstruktur für die Entwicklung von Berichten und die Aktualisierung der Daten wichtig ist, und ich brauche diese Funktionalität, um sehr schnell zu sein.

Die Eingabe erfolgt nur einmal für das Laden von Dateien und die Ausgabe nur für das Speichern von Dateien, normalerweise nur einmal. Diese sollten auch schnell sein, sind aber nicht so wichtig wie der Zugriff und die Aktualisierung von Daten in den Memory.

Mein Verständnis ist, dass Parser von Drittanbietern nur bei Eingabe und Ausgabe helfen, jedoch nicht bei der Verwendung und Änderung der Daten, die einmal in den Speicher geladen wurden. Oder irre ich mich das?

War es hilfreich?

Lösung

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

Unter dieser Bedingung und wenn die Leistung von entscheidender Bedeutung ist, Dann können Sie es mit direkter Textmanipulation versuchen - überspringen Sie die XML -Parsen.

Lesen Sie aus dem Stream einen schnellen Text -Suchalgorithmus z. Boyer-Moore, Um Orte zu finden, an denen Sie Daten ändern müssen, machen Sie Ihre Änderungen und geben Sie Daten in einen anderen Stream aus.

Dies wäre einpass, kein XML-Parsen, kein XML-Baumgebäude in Memory.

Andere Tipps

Sax ist es wert, anstelle eines Dom -Parsers in Betracht zu ziehen.

Mit DOM zahlen Sie den Overhead für das Laden des Dokuments, aber nach dem schnell geladenen Daten können schnell zugegriffen und aktualisiert werden.

Mit SAX müssen Sie Handler für Anfänger, Endelement usw. schreiben, aber Sie haben viel mehr Flexibilität bei dem, was Sie tun, wenn Sie mithalten.

Obwohl es Ihrer Situation wahrscheinlich nicht hilft, ist SAX sehr nützlich, wo Sie suchen, da Sie das Parsen zu jedem Zeitpunkt stoppen können. Wenn Sie also festgestellt haben, was Sie wollten, können Sie aufhören.

Wenn Ihr Programm nicht alle Daten analysiert haben muss Laden Sie alles in jede Art von Speicherstruktur. Dies würde die Lösung sehr skalierbar machen, da Sie nicht mit sehr großen Dateien auf Speicherbeschränkungen klicken.

Für das, was es wert ist, neige ich dazu, die MSXML DOM- und SAX -Parser zu verwenden. Es kann argumentiert werden, dass sie nicht die beste Leistung sind, ich argumentiere, dass es wahrscheinlich mehr Menschen gibt, die sie verbessern, damit sie immer besser werden.

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 wird gesagt, dass er Fast sein soll.

Vielleicht möchten Sie sich das ansehen DihtmlParser -Komponente aus der Delphi -Inspiration. Es soll "extrem schnell sein, besonders wenn sie riesige Dateien analysieren", und "auf modernen Maschinen steigt die Punktzahl auf mehr als 15 MB HTML -Daten pro Sekunde". Ich habe einige ziemlich gute Erfahrungen damit gemacht, obwohl ich es nie mit riesigen Dateien ausprobiert habe.

Ich bin kein Spezialist, aber ich glaube, der Konsens besteht darin, dass ein SAX -Parser weitaus effizienter sein wird als Dom ...

Wenn Sie jemals einen ereignisgesteuerten SAX -Weg in Betracht ziehen, XML Parser Library könnte ziemlich praktisch kommen.

Eine andere Möglichkeit, die ich gerade entdeckt habe, ist mit dem LMD Elpack -Paket Ich habe gekauft, sie enthalten eine XML-Support-Bibliothek, von der sie sagen, dass sie "extrem schnell, vollständig unikodisch fähig ist und Ihren Exe-Dateien nur einen kleinen Fußabdruck hinzufügt".

Angesichts der Quelle ihrer LMDXML.PAS -Einheit, die im LMD 7 -Paket (für Delphi 2009) enthalten ist, heißt es, der Code basiert auf dem Code von Simplexml Release 8.0 (Juli 2006) von Michail VLASOV.

Wenn Sie nur direkte Manipulation benötigen, würde ich der Antwort von Zendar zustimmen.

Wie für die DOM- oder SAX -Implementierung würde ich empfehlen Dixml.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top