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

Langage PHP Discussion :

Fuites mémoire + boucle


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Par défaut Fuites mémoire + boucle
    Pour résumer c'est une vulgaire extraction d'une table envoyé au navigateur en fichier CSV à la volé.


    Le code se situe dans une fonction d'une class :


    Garbage Colletor enabled (défaut) : OUI
    utilisation de la mémoire : 3139.66 Mo

    exécution de la requête (environ 200 000 lignes sur 25 colones)
    22.28 Mo

    jusqu'à là pas de problème


    ensuite vient le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $tab = array();
    		while ($tab = mysql_fetch_array($res,MYSQL_NUM)) { 
    			//echo implode("`|", $tab) . "\n<br />";
    			echo round(memory_get_usage()/(1024*1024),2)." Mo<br />";
    			unset($tab);
    			gc_collect_cycles();
    		}
    résultats :

    1er ligne : 22.28 Mo
    60164 ligne : 127.85 Mo


    j'ai retirer les lignes dans la boucle et juste ce code là pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $tab = array();
    		while ($tab = mysql_fetch_array($res,MYSQL_NUM)) { 
     
    		}
    j'ai essayé avec d'autre fonction mysql comme mysql_fetch_object etc... mais cela ne change rien.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    je ne sais pas si tu travaille sur MySQL mais il t'est possible de créer le .csv avec le MySQL et de servir le résultat tel quel avec PHP (plus de problème de mémoire)
    Quelque chose du genre :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM table
    INTO OUTFILE '/tmp/csv_output.csv'
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    A creuser...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Par défaut
    Effectivement ça résout ce problème là, quoi que non car le serveur BDD est pas sur la même machine que le serveur PHP. Enfin ya toujours moyen de faire de la bidouille, mais ça ne résout pas le problème de fond.

    Mais c'est un chose récurrente chez moi, car je commence de plus en plus à utiliser php en langage de batch pour des traitements de données (grab etc...)

    En écrivant comme un goret avec une fonction appelé dans une boucle on arrive à récupérer de la mémoire, mais c'est beaucoup moins performant en vitesse d’exécution.

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    C'est clair qu'avec ton code tu vas récupérer en mémoire l'intégralité de ton tableau. Je ne sais pas l'impact d'une autre approche : si par exemple tu remplissais au fur et à mesure un fichier .csv toutes les 1000 lignes :
    avec quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_put_contents($file, $data, FILE_APPEND | LOCK_EX);

  5. #5
    Membre éprouvé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 146
    Par défaut
    Juste le fait de boucler dans rien faire pose problème, alors le fait d'ajouter le résultat dans un fichier ne ferait qu'empirer.


    petite précision :
    php -v
    PHP 5.3.17-1~dotdeb.0 with Suhosin-Patch (cli) (built: Sep 14 2012 11:40:39)
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
        with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH
    
    serveur : 
    3GHz
    4Go de ram
    

  6. #6
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    ça ne sert à rien, c'est pas l'appel adapté:

    d'une part la collecte doit te retourner 0 à chaque fois (ton tableau c'est pas des variables à référence circulaire), d'autre par le garbage collector s’exécute de façon (pseudo) non déterministe, va voir les parametres php.ini.

    La mémoire est consommée jusqu'à ce qu'il n'y en ai plus dispo. tant que tu es dans la limite autorisée, laisse php consommer ce dont il a besoin. Quand il arrive au max, il libère les variables non référencées et recycle la mémoire.

    L'idée générale c'est que le GC consomme plus de perf que laisser les mémoires en place et attendre la fin de l'exec du processus php et que l'os récupère la mémoire.

    si ton php utilise trop de mémoire, tu lui baisses la mémoire autorisée. Tu ne reçois pas d'erreur? alors go.

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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