Page 1 sur 1

Parser un XML de 130mo...

Posté : 13 avr. 2010, 15:09
par hadrien
Bonjour à tous,

Je suis contronté à un probleme de poids :mrgreen:
Je dois parser un XML de 130mo pour l'insérer dans une bdd (des petites annonces). Bien sur j'ai une erreur de allocate memory, je l'ai augmenté avec un ini_set() mais même ça plante le serveur c'est la misère.

J'ai vu que l'on pouvait ouvrir un fichier xml octet par octet mais je ne trouve nul par comment faire, peut etre avez vous des idées ?

Merci !

Re: Parser un XML de 130mo...

Posté : 13 avr. 2010, 18:12
par stealth35
hello, t'as possibilité de (g)zipper ton XML ?
sinon regarde du coté de xml_set_element_handler

Re: Parser un XML de 130mo...

Posté : 14 avr. 2010, 14:32
par macgawel
Bonjour.

C'est un besoin ponctuel, ou ça sera régulier ?
On peut voir ton code, ou au moins connaître la méthode utilisée ?

Quelques pistes :
- Suivant la BDD utilisée, il peut être possible d'importer le XML directement.
- Utilise XSL pour "transformer" ton XML en CSV.

- Utiliser xpath.
J'ai testé avec un "petit" fichier (15 Mo, 3700 articles) et ce script :
$doc = new DOMDocument;
$doc->Load('test.xml');
$xpath = new DOMXPath($doc);
$query = '//tests/test';
$entries = $xpath->query($query);
. Ce qui te bouffe de la mémoire, c'est quand tu fais le query.
Une solution pour contourner le problème : faire plusieurs query qui renvoient peu de résultat.

Dans l'idéal tu vas carrément travailler article par article :
for ($i = 1; $i <= $nbr_articles; $i++) {
// On va chercher uniquement l'article n° $i
   $query = "//tests/test[position()=$i]";
   $entries = $xpath->query($query);
   // Traitement de l'article => Faire INSERT ou rajouter dans un CSV
}
Par contre, ça va prendre du temps => Gros risques de time out.
=> Augmenter le time-out, découper en tranches ou travailler en AJAX (appeler le script avec le n° à traiter en paramètre. Quand on a le retour, rappeler le script avec le n° suivant)