Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die neue XML-Verarbeitungsmethode VTD-XML

Einführung in die neue XML-Verarbeitungsmethode VTD-XML

黄舟
黄舟Original
2017-02-28 17:20:031470Durchsuche

Probleme

Wenn wir über die Verwendung von XML sprechen, ist der problematischste Teil normalerweise die Ausführlichkeit von XML und die Analysegeschwindigkeit von XML. Dieses Problem wird besonders gravierend, wenn große XML-Dateien verarbeitet werden müssen. Was ich hier erwähne, ist das Thema, wie die XML-Verarbeitungsgeschwindigkeit optimiert werden kann.

Wenn wir uns für die Verarbeitung von XML-Dateien entscheiden, haben wir im Allgemeinen zwei Möglichkeiten:

DOM, das W3C-Standardmodell, das XML-Strukturinformationen in Baumform erstellt und Schnittstellen und Methoden bereitstellt für das Durchqueren dieses Baumes.
SAX, ein Low-Level-Parser, führt eine elementweise Vorwärts-Leseverarbeitung durch und enthält keine Strukturinformationen.
Beide der oben genannten Optionen haben ihre eigenen Vor- und Nachteile, aber keine ist eine besonders gute Lösung. Ihre Vor- und Nachteile sind wie folgt:

DOM

Vorteile: Benutzerfreundlichkeit, Da alle XML-Strukturinformationen im Speicher vorhanden sind und die Durchquerung einfach ist und XPath unterstützt.
Nachteile: Die Parsing-Geschwindigkeit ist zu langsam, die Speichernutzung ist zu hoch (5x~10x der Originaldatei) und die Verwendung für große Dateien ist fast unmöglich.
SAX

Vorteile: Das Parsen ist schnell und die Speichernutzung hängt nicht von der Größe von XML ab (es kann durchgeführt werden, ohne dass der Speicher erhöht wird, wenn XML wächst).
Nachteile: Schlechte Benutzerfreundlichkeit, da keine Strukturinformationen vorhanden sind, nicht durchlaufen werden können und XPath nicht unterstützt wird. Wenn Sie eine Struktur benötigen, können Sie nur ein wenig lesen und ein wenig konstruieren, was die Wartbarkeit sehr schlecht macht.
Wir sehen, dass DOM und SAX im Grunde zwei gegensätzliche Extreme sind, aber keines von beiden kann die meisten unserer Anforderungen gut erfüllen. Wir müssen eine andere Verarbeitungsmethode finden. Beachten Sie, dass das Effizienzproblem mit XML kein Problem mit XML selbst ist, sondern ein Problem mit dem Parser, der XML verarbeitet, genau wie die beiden Methoden, die wir oben gesehen haben, unterschiedliche Effizienzkompromisse haben.

Denken

Wir mögen die Verwendung von DOM-ähnlichen Methoden, weil wir traversieren können, was bedeutet, dass XPath unterstützt werden kann, was die Benutzerfreundlichkeit erheblich verbessert, aber die Effizienz von DOM ist sehr gering . Wie wir bereits wissen, liegt das Effizienzproblem im Verarbeitungsmechanismus. Welche Aspekte von DOM beeinflussen also seine Effizienz? Lassen Sie uns eine umfassende Analyse durchführen:

Auf den meisten heutigen Plattformen, die auf der Technologie virtueller Maschinen (gehostet oder ein ähnlicher Mechanismus) basieren, ist die Erstellung und Zerstörung von Objekten eine zeitaufwändige Aufgabe (es lohnt sich). Da die Garbage Collection sehr zeitaufwändig ist, ist die große Anzahl der im DOM-Mechanismus verwendeten Objekterstellungs- und -zerstörungsvorgänge zweifellos einer der Gründe, die seine Effizienz beeinträchtigen (dies führt zu zu vielen Garbage Collections).
Jedes Objekt verfügt über zusätzliche 32 Bit zum Speichern seiner Speicheradresse. Wenn es eine große Anzahl von Objekten wie DOM gibt, sind diese zusätzlichen Kosten nicht gering.
Das Hauptproblem bei der Effizienz, das die beiden oben genannten Probleme verursacht, besteht darin, dass sowohl DOM als auch SAX extraktive Parsing-Modi sind. Dieser Parsing-Modus erfordert zwangsläufig eine große Anzahl von Erstellungs- (Zerstörungs-)Objekten für DOM und SAX, was zu Effizienzproblemen führt. Das sogenannte extraktive Parsen bedeutet, dass beim Parsen von XML, DOM oder SAX ein Teil der Originaldatei (im Allgemeinen eine Zeichenfolge) extrahiert und dann im Speicher analysiert und erstellt wird (die Ausgabe besteht natürlich aus einem oder mehreren Objekten). Nehmen Sie DOM als Beispiel. DOM analysiert jedes Element, jedes Attribut, jeden Verarbeitungsbefehl, jeden Kommentar usw. in ein Objekt und gibt ihm eine Struktur. Dies ist das sogenannte extraktive Parsen.
Ein weiteres Problem, das durch das Problem der Extraktivierung verursacht wird, ist die Aktualisierungseffizienz in DOM (SAX unterstützt keine Aktualisierung, daher werden wir es überhaupt nicht erwähnen), jedes Mal, wenn wir Änderungen vornehmen müssen, müssen wir nur Folgendes tun Aktualisieren Sie dann die Informationen des Objekts. Beachten Sie, dass es sich bei dieser Analyse um eine vollständige Analyse handelt, das heißt, dass die Originaldatei nicht verwendet wird, sondern das DOM-Modell direkt vollständig in eine XML-Zeichenfolge analysiert wird. Mit anderen Worten: DOM unterstützt keine inkrementelle Aktualisierung (inkrementelle Aktualisierung).
Ein weiteres „kleines“ Problem, das möglicherweise nicht bemerkt wird, ist die Codierung von XML. Unabhängig davon, welche Analysemethode verwendet wird, muss sie in der Lage sein, die Codierung von XML zu verarbeiten, dh die Decodierung beim Lesen und beim Schreiben. beim Codieren. Ein weiteres Effizienzproblem bei DOM besteht darin, dass, wenn ich nur eine kleine Änderung an einem großen XML vornehmen möchte, zunächst die gesamte Datei dekodiert und dann die Struktur erstellt werden muss. Unsichtbar ist es ein weiterer Kostenfaktor.
Lassen Sie uns das Problem zusammenfassen: Das Effizienzproblem von DOM liegt hauptsächlich in seinem extraktiven Analysemodus (dasselbe gilt für SAX, das das gleiche Problem hat). kann überwunden werden. Wenn ein Effizienzengpass vorliegt, ist es denkbar, dass die XML-Verarbeitungseffizienz weiter verbessert wird. Wenn die Benutzerfreundlichkeit und Verarbeitungseffizienz von XML erheblich verbessert werden, werden der Anwendungsbereich und das Anwendungsmodell von XML weiter sublimiert, und möglicherweise werden viele wunderbare Dinge entstehen, an die noch nie zuvor gedacht wurde.

Der Ausweg

VTD-XML ist die Antwort, die nach Überlegungen zu den oben genannten Problemen gegeben wurde. Aufgrund seines hervorragenden Mechanismus ist es eine gute Lösung. zu vermeiden) löst die verschiedenen oben angesprochenen Probleme und bringt „nebenbei“ auch andere nicht-extraktive Vorteile mit sich, wie schnelles Parsen und Durchlaufen, XPath-Unterstützung, inkrementelle Aktualisierung usw. Ich habe hier einen Datensatz, der von der offiziellen Website von VTD-XML stammt:

Die Parsing-Geschwindigkeit von VTD-XML beträgt das 1,5- bis 2,0-fache der von SAX (mit NULL-Content-Handler). Mit NULL bedeutet der Inhaltshandler, dass keine zusätzliche Verarbeitungslogik in die SAX-Analyse eingefügt wird, was die maximale Geschwindigkeit von SAX darstellt.
Die Speichernutzung von VTD-XML beträgt das 1,3- bis 1,5-fache der des ursprünglichen XML (der 1,0-fache Teil ist das ursprüngliche XML und der 0,3- bis 0,5-fache Teil ist der von VTD-XML belegte Teil). Die Speichernutzung des DOM beträgt das 1,3- bis 1,5-fache der des ursprünglichen XML und das 5- bis 10-fache von XML. Wenn beispielsweise die Größe einer XML-Datei 50 MB beträgt, liegt der von VTD-XML belegte Speicher zwischen 65 MB und 75 MB, während der von DOM belegte Speicher zwischen 250 MB und 500 MB liegt. Die Verwendung von DOM zur Verarbeitung großer XML-Dateien basierend auf diesen Daten ist nahezu unmöglich.
Sie finden es vielleicht unglaublich, ist es wirklich möglich, einen XML-Parser zu erstellen, der einfacher zu verwenden als DOM und schneller als SAX ist? Ziehen Sie keine voreiligen Schlüsse, werfen wir einen Blick auf die Prinzipien von VTD-XML!

Grundprinzip

Wie die meisten guten Produkte ist das Prinzip von VTD-XML nicht kompliziert, aber sehr clever. Um den Zweck der Nichtextraktion zu erreichen, wird die ursprüngliche XML-Datei im Binärmodus unverändert in den Speicher eingelesen, ohne sie überhaupt zu dekodieren. Anschließend wird die Position jedes Elements in diesem Byte-Array analysiert und einige Informationen aufgezeichnet werden für diese gespeicherten Datensätze ausgeführt. Wenn der XML-Inhalt extrahiert werden muss, werden die Position und andere Informationen im Datensatz verwendet, um das ursprüngliche Byte-Array zu dekodieren und eine Zeichenfolge zurückzugeben. Das scheint alles einfach zu sein, aber dieser einfache Prozess weist mehrere Leistungsdetails auf und verbirgt mehrere potenzielle Funktionen. Beschreiben wir zunächst jedes Leistungsdetail:

Um eine übermäßige Objekterstellung zu vermeiden, hat VTD-XML beschlossen, den ursprünglichen numerischen Typ als Datensatztyp zu verwenden, sodass kein Heap erforderlich ist. Der Aufzeichnungsmechanismus von VTD-XML heißt VTD (Virtual Token Descriptor). VTD löst den Leistungsengpass in der Tokenisierungsphase, was ein sehr cleverer und durchdachter Ansatz ist. VTD ist ein numerischer Typ mit einer Länge von 64 Bit, der Informationen wie die Startposition (Offset), die Länge (Length), die Tiefe (Tiefe) und den Token-Typ (Type) jedes Elements aufzeichnet.
Beachten Sie, dass VTD eine feste Länge hat (offiziell wurde die Verwendung von 64 Bit beschlossen). Da die Länge fest ist, ist es beim Lesen, Abfragen und anderen Vorgängen äußerst effizient , das heißt Arrays, eine effiziente Struktur, die zum Organisieren von VTDs verwendet werden kann, reduzieren Leistungsprobleme, die durch die große Verwendung von Objekten verursacht werden, erheblich.
Die Superleistung von VTD (keine Übertreibung) besteht darin, dass es einfach eine baumförmige Datenstruktur wie XML in eine Operation für ein Byte-Array umwandeln kann. Jede Operation, die Sie sich für ein Byte-Array vorstellen können, kann auf alle angewendet werden XML. Dies liegt daran, dass das eingelesene XML binär ist (Byte-Array) und VTD die Position jedes Elements und andere Zugriffsinformationen aufzeichnet. Wenn wir die zu bedienende VTD finden, müssen wir nur Informationen wie Offset und Länge verwenden Operation auf dem ursprünglichen Byte-Array, oder Sie können direkt auf der VTD arbeiten. Wenn ich beispielsweise ein Element in einem großen XML finden und löschen möchte, muss ich nur die VTD dieses Elements finden (die Traversal-Methode wird später besprochen), diese VTD aus dem VTD-Array löschen und dann verwenden alle Schreiben Sie die VTD einfach in ein anderes Byte-Array. Da die gelöschte VTD den Speicherort des zu löschenden Elements markiert, wird dieses Element nicht im neu geschriebenen Byte-Array angezeigt. Verwenden Sie VTD, um das neue Byte-Array zu schreiben das Byte-Array, und seine Effizienz ist ziemlich hoch. Dies ist das sogenannte inkrementelle Update.
In Bezug auf die Traversal-Methode von VTD-XML wird LC (Location Cache) verwendet, bei dem es sich einfach um eine baumförmige Tabellenstruktur handelt, die standardmäßig mit VTD basierend auf seiner Tiefe erstellt wurde. Der Eintrag von LC ist ebenfalls ein 64-Bit langer numerischer Typ. Die ersten 32 Bit stellen den Index einer VTD dar, und die letzten 32 Bit stellen den Index des ersten untergeordneten Elements dieser VTD dar. Mit diesen Informationen können Sie jede Position berechnen, die Sie erreichen möchten. Informationen zu bestimmten Durchquerungsmethoden finden Sie im Artikel auf der offiziellen Website. Es ist verständlich, dass VTD-XML, das auf dieser Traversierungsmethode basiert, andere Operationsschnittstellen als DOM hat, und diese Traversierungsmethode von VTD-XML kann Sie in den wenigsten Schritten an den Ort bringen, den Sie benötigen. Die Traversierungsleistung ist sehr hervorragend.

Zusammenfassung

Wie Sie oben sehen können, verfügt VTD-XML über faszinierende Funktionen, und jetzt hat Version 1.5 Unterstützung für XPath hinzugefügt (solange es durchlaufen werden kann, kann es XPath unterstützen). ist eine Frage der Zeit :-)), seine Praktikabilität hat den Rahmen dessen, was wir uns heute vorstellen, überschritten. Eine weitere Superleistung von VTD-XML besteht darin, dass es basierend auf seiner aktuellen Verarbeitungsmethode den zukünftigen binären XML-Standard vollständig unterstützen und die Anwendung von XML durch Binary auf ein höheres Niveau bringen kann! Darauf freue ich mich jetzt! :-)

Allerdings gibt es bei VTD-XML noch viele Bereiche, die verbessert und perfektioniert werden müssen, und dieser Aspekt ist unserer Bemühungen und Diskussion wert.

Das Obige ist die Einführung der neuen XML-Verarbeitungsmethode VTD-XML. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn