Je dois analyser de gros fichiers XML en php, l'un d'eux fait 6,5 Mo et ils pourraient être encore plus gros. L'extension SimpleXML que j'ai lue, charge le fichier entier dans un objet, ce qui peut ne pas être très efficace. D'après votre expérience, quelle serait la meilleure façon?
Pour un fichier volumineux, vous voudrez utiliser un analyseur SAX plutôt qu'un analyseur DOM.
Avec un analyseur DOM, il lira tout le fichier et le chargera dans une arborescence d'objets en mémoire. Avec un analyseur SAX, il lira le fichier séquentiellement et appellera vos fonctions de rappel définies par l'utilisateur pour gérer les données (balises de début, balises de fin, CDATA, etc.)
Avec un analyseur SAX, vous devrez maintenir l'état vous-même (par exemple, dans quelle balise vous vous trouvez actuellement), ce qui le rend un peu plus compliqué, mais pour un fichier volumineux, il sera beaucoup plus efficace en termes de mémoire.
Mon point de vue:
https://github.com/prewk/XmlStreamer
Une classe simple qui extraira tous les enfants vers l'élément racine XML lors de la diffusion du fichier. Testé sur un fichier XML de 108 Mo sur pubmed.com.
class SimpleXmlStreamer extends XmlStreamer {
public function processNode($xmlString, $elementName, $nodeIndex) {
$xml = simplexml_load_string($xmlString);
// Do something with your SimpleXML object
return true;
}
}
$streamer = new SimpleXmlStreamer("myLargeXmlFile.xml");
$streamer->parse();
Lorsque vous utilisez un DOMDocument
avec de gros fichiers XML, n'oubliez pas de passer l'indicateur LIBXML_PARSEHUGE
dans les options de load()
méthode. (Il en va de même pour les autres méthodes load
de l'objet DOMDocument
)
$checkDom = new \DOMDocument('1.0', 'UTF-8');
$checkDom->load($filePath, LIBXML_PARSEHUGE);
(Fonctionne avec un fichier XML 120mo)
Un analyseur SAX, comme le recommande Eric Petroelje, serait préférable pour les gros fichiers XML. Un analyseur DOM se charge dans tout le fichier XML et vous permet d'exécuter des requêtes xpath - un analyseur SAX (API simple pour XML) lira simplement une ligne à la fois et vous donnera des points de raccordement pour le traitement.
Cela dépend vraiment de ce que vous voulez faire des données? Avez-vous besoin de tout cela en mémoire pour travailler efficacement avec lui?
6,5 Mo n'est pas si gros, en termes d'ordinateurs d'aujourd'hui. Vous pouvez, par exemple, ini_set('memory_limit', '128M');
Cependant, si vos données peuvent être diffusées, vous pouvez envisager d'utiliser un analyseur SAX . Cela dépend vraiment de vos besoins d'utilisation.
L'analyseur SAX est le chemin à parcourir. J'ai trouvé que l'analyse SAX peut devenir compliquée si vous ne restez pas organisé.
J'utilise une approche basée sur STX (Streaming Transformations for XML) pour analyser de gros fichiers XML. J'utilise les méthodes SAX pour construire un objet SimpleXML pour garder une trace des données dans le contexte actuel (c'est-à-dire uniquement les nœuds entre la racine et le nœud actuel). D'autres fonctions sont ensuite utilisées pour traiter le document SimpleXML.
J'avais besoin d'analyser un gros fichier XML qui contenait un élément sur chaque ligne (le vidage de données StackOverflow). Dans ce cas précis, il suffisait de lire le fichier une ligne à la fois et d'analyser chaque ligne à l'aide de SimpleXML. Pour moi, cela avait l'avantage de ne pas avoir à apprendre quoi que ce soit de nouveau.