L'optimisation des performances a toujours été au centre des développeurs lorsqu'il s'agit de grands fichiers XML. Surtout lorsque vous utilisez XML_PARSER_CREATE_NS dans PHP pour analyser les fichiers XML avec des espaces de noms, comment améliorer l'efficacité et réduire la consommation de mémoire est devenu un problème qui ne peut pas être ignoré. Cet article explorera quelques conseils clés en matière d'amélioration des performances pour vous aider à analyser les grands fichiers XML plus efficacement.
Pour les grands fichiers XML, il est important d'éviter de charger des fichiers en mémoire à la fois. Le XML_PARSER_CREATE_NS de PHP peut être utilisé pour analyser les fichiers étape par étape avec l'analyse incrémentielle, plutôt que de charger le fichier entier à la fois. Cette approche réduit considérablement l'empreinte de la mémoire et est en mesure de gérer d'énormes fichiers XML qui ne peuvent pas être complètement chargés dans la mémoire.
La méthode de l'analyse incrémentielle est de lire le contenu XML ligne par ligne pendant l'analyse. De cette façon, vous pouvez traiter chaque partie des données lors de l'analyse, sans attendre que le fichier se charge complètement.
<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>
Dans cet exemple, Fread est utilisé pour lire les données des fichiers par lots, tandis que XML_PARSE est utilisé pour analyser les données pour chaque lot. Cette méthode évite de charger le fichier entier en mémoire à la fois.
Pendant l'analyse incrémentielle, la taille du tampon de la frea peut être ajustée. En choisissant la bonne taille de tampon, vous pouvez équilibrer l'utilisation de la mémoire et les performances d'E / S. Des tampons trop petits peuvent conduire à trop d'opérations d'E / S, et des tampons trop importants peuvent conduire à une utilisation trop élevée de la mémoire.
En règle générale, la définition du tampon entre 4 Ko et 8 Ko est un choix approprié. Vous pouvez affiner en fonction de la taille réelle du fichier et de la limite de mémoire.
XML_PARSER_CREATE_NS vous permet de définir plusieurs fonctions de rappel pour le processus d'analyse XML, tel que StartElement , Endement et CaracterData . Pour les fichiers volumineux, trop de fonctions de rappel peuvent entraîner des problèmes de performances, surtout si le fichier contient un grand nombre d'éléments. Pour améliorer les performances, il est recommandé d'utiliser la fonction de rappel uniquement si nécessaire et d'optimiser sa logique interne.
<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">// Seuls les éléments nécessaires sont traités</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">// Seuls les éléments nécessaires sont traités</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">// Traiter les données des caractères</span></span><span>
}
</span></span>
En limitant le contenu d'exécution de la fonction de rappel et en évitant les calculs inutiles, la vitesse d'analyse peut être considérablement améliorée.
La structure des fichiers XML a un impact direct sur les performances d'analyse. Pour les fichiers volumineux, essayez d'éviter la nidification profonde ou les grandes quantités d'informations redondantes. Essayez d'utiliser des structures XML plates, ce qui peut réduire le nombre de nœuds qui doivent être traités pendant l'analyse.
Si le fichier XML est trop complexe, envisagez de prétraiter le fichier, en supprimant certains éléments ou attributs inutiles, en simplifiant la structure du fichier, améliorant ainsi l'efficacité de l'analyse.
La gestion des erreurs et la journalisation peuvent être un fardeau de performances lors de l'analyse des fichiers XML. Surtout lorsqu'il s'agit de fichiers volumineux, chaque enregistrement d'erreur ou d'avertissement consomme des ressources supplémentaires. Pour les fichiers XML traités par lots, la gestion des erreurs et la journalisation peuvent être temporairement désactivés pour les performances.
<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">// Désactiver la sortie d'erreur</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>
L'éteindre la gestion des erreurs n'affecte pas les erreurs mortelles pendant l'analyse, mais empêche la connexion à chaque petite erreur, en réduisant les frais généraux de performance inutiles.
Lors de l'analyse de très grands fichiers XML, des méthodes d'analyse de mémoire traditionnelles peuvent échouer en raison d'une mémoire insuffisante. À l'heure actuelle, vous pouvez envisager d'utiliser la technologie de fichiers mappé par la mémoire. En mappant des fichiers en mémoire, le système d'exploitation gère automatiquement le chargement et la libération de fichiers, améliorant ainsi les performances.
Les fichiers mappés de mémoire peuvent être implémentés via une combinaison de fopen et file_get_contents , bien que cela n'affecte pas directement XML_PARSER_CREATE_NS , mais il est très efficace pour lire des fichiers volumineux.
Pour les fichiers XML extrêmement grands, il peut devoir être divisé en plusieurs fichiers ou blocs plus petits pour le traitement. Vous pouvez utiliser des outils de streaming tels que XMLReader pour segmenter les fichiers volumineux ou diviser les fichiers en plusieurs parties pour l'analyse parallèle. Cela améliore non seulement les performances, mais évite également le débordement de la mémoire.
<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">// Traiter chaque élément</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>
La lecture des fichiers XML Node par nœud via XMLReader peut efficacement enregistrer la mémoire et améliorer les performances d'analyse.
L'optimisation des performances est essentielle lors de l'analyse de grands fichiers XML. En adoptant l'analyse incrémentielle, en ajustant rationnellement la taille du tampon, en simplifiant la logique des fonctions de rappel et en optimisant la structure des fichiers XML, nous pouvons améliorer considérablement l'efficacité de l'analyse et réduire l'utilisation de la mémoire. Pour les fichiers XML extrêmement grands, l'utilisation de fichiers mappés de mémoire et de traitement de segmentation peut également optimiser davantage les performances. J'espère que les suggestions d'optimisation de cet article pourront vous aider à traiter avec succès de grands fichiers XML dans les projets réels et à améliorer les performances et la stabilité des applications.