Messages: 148

Enregistré le: 22 Aoû 2010

Message le Ven Aoû 26, 2011 21:23

Bonjour,

je cherche à parser un fichier xml de 12 Go. Et je le fait en ligne de commande avec la commande php sous un serveur linux de 4Go de RAM avec un core2Duo de 2,5Ghz.

Cependant, la fonction @simplexml_load_file("fichier.xml") semble avoir des limites,

car le script de parsage s'intérrompt en affichant "Processus arreté".

Pourtant au début de mon script, j'ai mis ces lignes :

ini_set('max_execution_time','0');
ini_set('memory_limit','-1');

mais ça ne change rien.

Savez-vous d'où vient le problème ?

Merci d'avance, cordialement.
Haut
4 Réponses
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Ven Aoû 26, 2011 21:26

Un fichier XML de 12 Go 8O
Il n'y a pas comme un petit problème de conception depuis le début de l'application ?
Haut
Messages: 90

Enregistré le: 1 Mar 2011

Message le Ven Aoû 26, 2011 22:31

Bonjour,

totoaussi a écrit:Cependant, la fonction @simplexml_load_file("fichier.xml") semble avoir des limites.

Savez-vous d'où vient le problème ?


Je ne connais pas ton SimpleXML, mais vu son nom, j'imagine qu'il utilise l'API DOM, et que la fonction simplexml_load_file charge le fichier en mémoire, n'est-ce-pas ? Auquel cas, il n'est pas étonnant que cela plante.

Pour des fichiers de cette taille, il te faut utiliser un parser qui utilise l'API SAX. Il permet d'analyser ton fichier comme un flux sans avoir besoin de le charger complètement en mémoire.
Haut
Messages: 90

Enregistré le: 1 Mar 2011

Message le Ven Aoû 26, 2011 22:38

spout a écrit:Un fichier XML de 12 Go 8O
Il n'y a pas comme un petit problème de conception depuis le début de l'application ?


Pas forcément. Peut-être s'amuse t-il avec OpenStreetMap. Planet.osm c'est un gros XML de plus de 160 Go.
Haut
Messages: 1847

Enregistré le: 31 Aoû 2007

Message le Sam Aoû 27, 2011 11:11

A mon avis, tu vas devoir le faire avec "autre chose" que PHP, en perl par exemple...
Est-ce que tu as des erreurs pour ton script :
Code: Tout sélectionner
ini_set('display_errors', 1);
error_reporting(E_ALL);

Ca pourrait peut-être déjà te donner des pistes.
Haut