Die Leistungsoptimierung war schon immer ein Schwerpunkt von Entwicklern, wenn es sich um große XML -Dateien handelt. Insbesondere bei der Verwendung von XML_PARSER_CREATE_NS in PHP, um XML -Dateien mit Namespaces zu analysieren, ist die Verbesserung der Effizienz und die Reduzierung des Speicherverbrauchs zu einem Problem geworden, das nicht ignoriert werden kann. In diesem Artikel werden einige wichtige Tipps zur Leistungsverbesserung untersucht, mit denen Sie große XML-Dateien effizienter analysieren können.
Bei großen XML -Dateien ist es wichtig, dass das Laden von Dateien gleichzeitig in Speicher geladen wird. PHPs XML_PARSER_CREATE_NS kann verwendet werden, um Dateien Schritt für Schritt mit inkrementellem Parsen zu analysieren, anstatt die gesamte Datei gleichzeitig zu laden. Dieser Ansatz reduziert den Speicher Fußabdruck erheblich und kann riesige XML -Dateien verarbeiten, die nicht vollständig in den Speicher geladen werden können.
Die Methode der inkrementellen Parsen besteht darin, die XML -Inhaltslinie während der Analyse durch Zeile zu lesen. Auf diese Weise können Sie jeden Teil der Daten beim Parsen verarbeiten, ohne darauf zu warten, dass die Datei vollständig geladen wird.
<span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create_ns</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">xml_set_element_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">"startElement"</span></span><span>, </span><span><span class="hljs-string">"endElement"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">xml_set_character_data_handler</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-string">"characterData"</span></span><span>);
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"large_file.xml"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">4096</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">xml_parse</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>));
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">xml_parser_free</span></span><span>(</span><span><span class="hljs-variable">$parser</span></span><span>);
</span></span>
In diesem Beispiel wird Fread verwendet, um Dateidaten in Stapeln zu lesen, während XML_Parse verwendet wird, um Daten für jede Stapel zu analysieren. In dieser Methode wird das Laden der gesamten Datei gleichzeitig in den Speicher geladen.
Während der inkrementellen Parsen kann die Puffergröße von Fread eingestellt werden. Durch die Auswahl der richtigen Puffergröße können Sie Speicherverbrauch und I/A -Leistung in Einklang bringen. Zu kleine Puffer können zu zu viel E/A -Operationen führen, und zu große Puffer können zu einem zu hohen Speicherverbrauch führen.
In der Regel ist es eine geeignete Wahl, den Puffer auf 4 KB und 8 KB zu setzen. Sie können basierend auf der tatsächlichen Größe der Datei und der Speichergrenze feinstimmen.
Mit XML_PARSER_CREATE_NS können Sie mehrere Rückruffunktionen für den XML -Parsing -Prozess wie Startelement , Endelement und CharakterDaten definieren. Für große Dateien können zu viele Rückruffunktionen Leistungsprobleme verursachen, insbesondere wenn die Datei eine große Anzahl von Elementen enthält. Um die Leistung zu verbessern, wird empfohlen, die Rückruffunktion nur bei Bedarf zu verwenden und ihre interne Logik zu optimieren.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">startElement</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$parser</span></span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$attrs</span></span><span>) {
</span><span><span class="hljs-comment">// Es werden nur notwendige Elemente verarbeitet</span></span><span>
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">endElement</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$parser</span></span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>) {
</span><span><span class="hljs-comment">// Es werden nur notwendige Elemente verarbeitet</span></span><span>
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">characterData</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$parser</span></span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) {
</span><span><span class="hljs-comment">// Prozessfigurendaten</span></span><span>
}
</span></span>
Durch die Begrenzung des Ausführungsinhalts der Rückruffunktion und zur Vermeidung unnötiger Berechnungen kann die Analysegeschwindigkeit erheblich verbessert werden.
Die Struktur von XML -Dateien hat einen direkten Einfluss auf die Analyseleistung. Versuchen Sie für große Dateien, tiefes Nisten oder große Mengen an redundanten Informationen zu vermeiden. Versuchen Sie, flache XML -Strukturen zu verwenden, die die Anzahl der Knoten verringern können, die während des Parsens verarbeitet werden müssen.
Wenn die XML -Datei zu komplex ist, sollten Sie die Datei vorverfernen, einige unnötige Elemente oder Attribute entfernen, um die Struktur der Datei zu vereinfachen und so die Analyseeffizienz zu verbessern.
Fehlerbehebung und -protokollierung können eine Leistungsbelastung sein, wenn XML -Dateien analysiert werden. Insbesondere beim Umgang mit großen Dateien verbraucht jede Aufzeichnung von Fehler oder Warnung zusätzliche Ressourcen. Für mit Batch verarbeitete XML-Dateien können Fehlerbehandlungen und Protokollierung vorübergehend für die Leistung ausgeschaltet werden.
<span><span><span class="hljs-title function_ invoke__">libxml_use_internal_errors</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// Fehlerausgabe deaktivieren</span></span><span>
</span><span><span class="hljs-variable">$parser</span></span><span> = </span><span><span class="hljs-title function_ invoke__">xml_parser_create_ns</span></span><span>();
</span></span>
Das Ausschalten des Fehlers beeinflusst die tödlichen Fehler während des Parsens nicht, sondern verhindert, dass die Protokollierung bei jedem kleinen Fehler verhindert wird, wodurch unnötige Leistungsaufwand verringert wird.
Bei der Analyse sehr großer XML-Dateien können herkömmliche Speicher-basierte Parsen-Methoden aufgrund eines unzureichenden Speichers fehlschlagen. Zu diesem Zeitpunkt können Sie in Betracht ziehen, die Dateitechnologie von Speichermorddateien zu verwenden. Durch das Zuordnen von Dateien in den Speicher verwaltet das Betriebssystem automatisch das Laden und die Freigabe von Dateien, wodurch die Leistung verbessert wird.
Speicherbeteiligte Dateien können über eine Kombination aus fopen und file_get_contents implementiert werden, obwohl sie nicht direkt XML_PARSER_CREATE_NS beeinflusst, aber das Lesen großer Dateien sehr effektiv ist.
Bei extrem großen XML -Dateien muss möglicherweise in mehrere kleinere Dateien oder Blöcke zur Verarbeitung unterteilt werden. Sie können Streaming -Tools wie XMLReader verwenden, um große Dateien zu segmentieren oder Dateien für die parallele Analyse in mehrere Teile zu teilen. Dies verbessert nicht nur die Leistung, sondern vermeidet auch Speicherüberlauf.
<span><span><span class="hljs-variable">$reader</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">XMLReader</span></span><span>();
</span><span><span class="hljs-variable">$reader</span></span><span>-></span><span><span class="hljs-title function_ invoke__">open</span></span><span>(</span><span><span class="hljs-string">"large_file.xml"</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$reader</span></span><span>-></span><span><span class="hljs-title function_ invoke__">read</span></span><span>()) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$reader</span></span><span>->nodeType == (</span><span><span class="hljs-title class_">XMLReader</span></span><span>::</span><span><span class="hljs-variable constant_">ELEMENT</span></span><span>)) {
</span><span><span class="hljs-comment">// Verarbeiten Sie jedes Element</span></span><span>
}
}
</span><span><span class="hljs-variable">$reader</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span></span>
Das Lesen von XML -Dateien Knoten per Knoten über XMLReader kann den Speicher effektiv speichern und die Analyseleistung verbessern.
Die Leistungsoptimierung ist bei der Parsen großer XML -Dateien von entscheidender Bedeutung. Durch die Übernahme inkrementeller Parsen, die rationale Anpassung der Puffergröße, die Vereinfachung der Logik der Rückruffunktionen und die Optimierung der XML -Dateistruktur können wir die Analyseeffizienz erheblich verbessern und den Speicherverbrauch reduzieren. Bei extrem großen XML -Dateien kann die Verwendung von Speicherzuordnungsdateien und Segmentierungsverarbeitung auch die Leistung weiter optimieren. Ich hoffe, dass die Optimierungsvorschläge in diesem Artikel Ihnen dabei helfen können, große XML -Dateien in tatsächlichen Projekten erfolgreich zu verarbeiten und die Anwendungsleistung und -stabilität zu verbessern.