Parsen von extrem großen XML-Dateien in php

Lesezeit: 3 Minuten

Parsen von extrem grosen XML Dateien in php
clean_coding

Ich muss XML-Dateien mit einer Größe von 40 GB analysieren, dann normalisieren und in eine MySQL-Datenbank einfügen. Wie viel von der Datei ich in der Datenbank speichern muss, ist nicht klar, und ich kenne auch die XML-Struktur nicht.

Welchen Parser sollte ich verwenden und wie würden Sie dies tun?

  • Verwenden Sie für große Dateien immer einen Pull-Parser wie XMLReader; Versuchen Sie einfach, eine Datei mit 40 GB für SimpleXML in den Speicher zu laden.

    – Mark Baker

    12. März ’13 um 14:25


  • aus den verwandten Beiträgen: stackoverflow.com/questions/911663/…

    – Nick Andriopoulos

    12. März ’13 um 14:26

  • 40 GB? Wow, ich hatte Probleme mit einer 700-Mb-XML-Datei auf einem Mac OS X-Rechner.

    – kohlensäurehaltiges Getränk

    12. März ’13 um 14:26

  • Ich würde vorschlagen, dass Sie Ihren eigenen XML-Parser mit minimalen Funktionen schreiben (nur die gewünschten Funktionen). Auf diese Weise haben Sie den leichtesten XML-Parser und optimieren natürlich regelmäßig

    – Girish

    12. März ’13 um 14:27

  • @Girish – das ist ein verrückter Vorschlag. Einige der besten Programmierer der Welt haben hochoptimierte XML-Parser geschrieben, die Chance, dass der durchschnittliche SO-Poster es besser machen kann, ist sehr gering.

    – Michael Kay

    12. März ’13 um 18:34

1641748203 278 Parsen von extrem grosen XML Dateien in php
hakre

In PHP können Sie extrem große XML-Dateien mit dem XMLReaderDokumente:

$reader = new XMLReader();
$reader->open($xmlfile);

Extrem große XML-Dateien sollten in einem komprimierten Format auf der Festplatte gespeichert werden. Dies ist zumindest sinnvoll, da XML-Dateien eine hohe Komprimierungsrate aufweisen. Zum Beispiel gzippt wie large.xml.gz.

PHP unterstützt das ganz gut mit XMLReader über die KompressionswickelDokumente:

$xmlfile="compress.zlib://path/to/large.xml.gz";

$reader = new XMLReader();
$reader->open($xmlfile);

Der XMLReader ermöglicht es Ihnen, “nur” das aktuelle Element zu bearbeiten. Das bedeutet, dass es nur vorwärts ist. Wenn Sie den Parserstatus beibehalten möchten, müssen Sie ihn selbst erstellen.

Ich finde es oft hilfreich, die grundlegenden Bewegungen in eine Reihe von Iteratoren zu packen, die wissen, wie man damit umgeht XMLReader wie das Iterieren nur durch Elemente oder untergeordnete Elemente. Sie finden dies in Parse XML with PHP and XMLReader beschrieben.

Siehe auch:

  • PHP Open gzipped XML

Es wäre schön zu wissen, was Sie eigentlich mit dem XML vorhaben. Die Art und Weise, wie Sie es parsen, hängt stark von der Verarbeitung ab, die Sie ausführen müssen, sowie von der Größe.

Wenn dies eine einmalige Aufgabe ist, habe ich in der Vergangenheit damit begonnen, die XML-Struktur zu entdecken, bevor ich etwas anderes getan habe. Mein DTDG-Generator (siehe saxon.sf.net) wurde vor langer Zeit für diesen Zweck geschrieben und tut immer noch seinen Job, es gibt jetzt andere Tools, aber ich weiß nicht, ob die Streaming-Verarbeitung tun, was hier Voraussetzung ist.

Sie können eine Anwendung schreiben, die die Daten entweder mit einem Pull- oder Push-Streamed-Parser (SAX oder StAX) verarbeitet. Wie einfach das geht, hängt davon ab, wie viel Bearbeitung Sie machen und wie viel Zustand Sie pflegen müssen, den Sie uns nicht mitgeteilt haben. Alternativ können Sie die gestreamte XSLT-Verarbeitung ausprobieren, die in Saxon-EE verfügbar ist.

.

227790cookie-checkParsen von extrem großen XML-Dateien in php

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy