Parser un XML de 130mo...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Parser un XML de 130mo...

Re: Parser un XML de 130mo...

par macgawel » 14 avr. 2010, 14:32

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)

Re: Parser un XML de 130mo...

par stealth35 » 13 avr. 2010, 18:12

hello, t'as possibilité de (g)zipper ton XML ?
sinon regarde du coté de xml_set_element_handler

Parser un XML de 130mo...

par hadrien » 13 avr. 2010, 15:09

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 !