IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Analyser gros fichier XML, enregistrement dans une table MySQL


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Analyser gros fichier XML, enregistrement dans une table MySQL
    Bonjour,

    Je dois parser un gros fichier xml (500 mo) afin d'extraire les données et de les enregistrer dans une table mysql (+ de 300 000 enregistrement).

    Pour parser j'utilise XMLReader.

    Le problème est que mon script s’arrête avant la fin.

    Après plusieurs test, le script effectue à chaque fois environ 21 000 insert puis s’arrête ce qui correspond à 20 min d’exécution.

    Le script ne s’arrête jamais au même endroit et ses deux premières lignes sont :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set_time_limit(0);
    ignore_user_abort(true);

    Auriez-vous des pistes à me proposer ?

    Merci.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Salut,

    Il est possible qu'à chaque itération tu utilises un peu plus de mémoire, vérifies que tu unset bien tes ressources ou que ton appli n'as pas un usage mémoire proportionnel à la taille du fichier.

    Les fonctions utiles sont je crois et
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    get_memory_peak_usage

    Tu peux aussi ajuster la variable de conf memory_limit pour t'aider.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est pour ce genre de requete, mais tu lis un fichier distant ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Non ce n'est pas un fichier distant c'est un fichier xml contenu dans une archive que je décompresse avant de le lire.

    je viens d'effectuer un test et mon script s'est arrêté au même moment ou le serveur utilisé toutes ses ressources en RAM.

    Existe-t-il un moyen de gérer la RAM utilisée par le serveur ?

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par bunsky Voir le message
    Non ce n'est pas un fichier distant c'est un fichier xml contenu dans une archive que je décompresse avant de le lire.

    je viens d'effectuer un test et mon script s'est arrêté au même moment ou le serveur utilisé toutes ses ressources en RAM.

    Existe-t-il un moyen de gérer la RAM utilisée par le serveur ?
    tu le décompresse direct en PHP ? si oui tu peux lire en stream dans un fichier compresser

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    tu le décompresse direct en PHP ? si oui tu peux lire en stream dans un fichier compresser
    Oui je décompresse en PHP.

    Faire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $xmlReader->open('fichier_xml.gz');
    aura le même résultat que
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
     $xmlReader->open('fichier_xml.xml');
    ?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par bunsky Voir le message
    Oui je decompresse en PHP.

    Faire : $xmlReader->open('fichier_xml.gz'); aura le même resultat que $xmlReader->open('fichier_xml.xml'); ?


    plus dans ce genre la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $xmlReader->open('compress.zlib://fichier_xml.gz');
    //ou
    $xmlReader->open('compress.zlib://fichier_xml.gz#fichier_xml.xml');
    a voir...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ok je vais tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xmlReader->open('compress.zlib://fichier_xml.gz#fichier_xml.xml');
    Pour l'utilisation de Il faut bien le faire de cette façon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $xmlReader = new XMLReader();
    $xmlReader->open('compress.zlib://fichier_xml.gz#fichier_xml.xml');
    stream_set_timeout($xmlReader, 3600);

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par bunsky Voir le message
    Ok je vais tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $xmlReader->open('compress.zlib://fichier_xml.gz#fichier_xml.xml');
    Pour l'utilisation de Il faut bien le faire de cette façon ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $xmlReader = new XMLReader();
    $xmlReader->open('compress.zlib://fichier_xml.gz#fichier_xml.xml');
    stream_set_timeout($xmlReader, 3600);
    yep, par contre je sais pas si ca passe outre le set_time_limit de php

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je viens de me rendre compte que l’arrêt de mon script était du à l'utilisation à un moment toutes les ressources du serveur !!

    J'utilise pourtant au maximum

    et

    mais rien à faire !!!

    Existe-til un moyen d’exécuter mon script en CLI ? Et si oui sera-t-il plus performant et moins gourmand en ressources ?

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    je te conseil de mettre ton mysql.trace_mode sur On pour voir tout les ressources qui traine, t'as pas mysqli ou PDO ? tu peux toujours montrer ton code on verra si y'a d'autre l'optimisation a faire

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Ou d'utiliser Perl pour parser ton fichier Perl .

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Après plusieurs essai je pensai avoir trouvé une solution à mon problème mais malheureusement ce n'est pas le cas.

    Mon script est gourmand à cause de la classe polygon.php qui me permet de géolocaliser des objets.

    En effet après chaque passage dans ma fonction l'utilisation de la mémoire ne cesse de croitre.

    Voici un extrait de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
    	$v =& new vertex($longitude, $latitude);
    	$polyA = new polygon();
    	echo '<div style="color :red;">Avant : '.memory_get_usage().'</div>';
    	for($i=0; $i<($nbPoints); $i++)
    	{	
    		$tabPointPoly=split(',', $tabPoints[$j][$i]);
    		if($tabPointPoly[0] != '' && $tabPointPoly[1] != '')
    		{
    			$polyA->addv($tabPointPoly[0],$tabPointPoly[1]);
     
    		}					
     
    	}
    	echo '<div style="color :blue;">Apres : '.memory_get_usage().'</div>';
     
    		if($polyA->isInside($vertex))
    		{
    			$polyA->res();
    			$vertex = NULL;
    			$polyA = NULL;
    			unset($vertex);
    			unset($polyA);
    			unset($i);
    			unset($j);
    			unset($nbPolygone);
    			unset($tabPointPoly);
    			unset($tabPoints);
    			unset($nbPoints);
    			echo '<div style="color :green;">Apres : '.memory_get_usage().'</div>';
    			return true;
    		}
    		else
    		{	
    			$polyA->res();
    			$vertex = NULL;
    			$polyA = NULL;
    			unset($vertex);
    			unset($polyA);
    			unset($i);
    			unset($j);
    			unset($nbPolygone);
    			unset($tabPointPoly);
    			unset($tabPoints);
    			unset($nbPoints);
    			echo '<div style="color :green;">Apres : '.memory_get_usage().'</div>';
    			return false;
    		}
    	?>

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/07/2012, 09h17
  2. [MySQL] Fichier XML qui remplit une table MySQL + pb d'accent
    Par sheira dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 17/09/2010, 10h01
  3. Ajout de lignes dans un tablea HTML : enregistrement dans une table Mysql
    Par jean-pierre96 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 23/04/2007, 18h44
  4. Réponses: 1
    Dernier message: 27/02/2007, 23h08
  5. Nombre d'enregistrement dans une table MySQL
    Par tom06440 dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 21/10/2005, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo