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

  1. #21
    Membre émérite
    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
    Points : 2 446
    Points
    2 446
    Par défaut
    phpMyAdmin depuis un serveur distant y arrive, il y plus qu'a lire le code ...
    je suppose que ton code sur ledit serveur distant y arrive?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  2. #22
    Membre habitué
    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
    Points : 172
    Points
    172
    Par défaut
    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
     
    $con = mysqli_connect("localhost", "root", "passwd", "Spooler");
     
     ini_set("memory_limit", "128M");
     
    $sql = "SELECT * FROM job_images LIMIT 50000";
     $res = mysqli_query($con, $sql);
     
     
     echo round(memory_get_peak_usage()/ (1024 ^ 2), 2) . " Mo\n";
     while ($tab = mysqli_fetch_object($res))
     { //MYSQL_NUM
             //echo implode("`|", $tab) . "\n<br />";
             //echo round(memory_get_usage()/(1024*1024),2)." Mo<br />";
     
             //$GLOBALS['_DEBUG']->save($i);
             //unset($tab);
     }
     echo round(memory_get_peak_usage()/ (1024 ^ 2), 2) . " Mo\n";
     mysqli_close($con);

    résultat :

    avec limit = 50000
    3737.72 Mo
    22453.69 Mo

    avec limit = 100000
    7246.5 Mo
    44675.91 Mo

    avec limit = 200000
    14264.04 Mo
    89120.36 Mo

    etc...

  3. #23
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Si tu limites la sélection avec des fields spécifiques au lieu d'un "select *" ?
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  4. #24
    Membre habitué
    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
    Points : 172
    Points
    172
    Par défaut
    le but étant de faire un export :p

  5. #25
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Tu peux tester quand même sur quelques champs ? (c'est pour cibler le problème, php a peut-être du mal en interne avec le "*").
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #26
    Membre habitué
    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
    Points : 172
    Points
    172
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE `job_images` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `created` datetime NOT NULL,
     `lastupdated` datetime NOT NULL,
     `version` int(11) NOT NULL,
     `meta` varchar(255) DEFAULT NULL,
     `quantity` int(11) NOT NULL,
     `image_id` int(11) NOT NULL,
     `job_id` int(11) NOT NULL,
     PRIMARY KEY (`id`),
     KEY `FK8F12A53A8B91C647` (`image_id`),
     KEY `FK8F12A53A9EDDCA47` (`job_id`)
    )

    la table SQL

    j'ai juste fait :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM job_images

    le problème reste entier, PS quel que soit la table où les données le résultat est le même.

    n'hésitez pas à faire le test chez vous avec n'importe quelle table qui à un peu de données =)


    PS : ne croyez pas que c'est simple :p, toutes les questions que j'ai pu poser dans le forum PHP n'ont jamais eu de réponse où je me suis répondu à moi-même.

  7. #27
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Bon ben j'ai testé chez moi (faut faire 1024*1024 parce que le carré il y arrive pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $sql = "SELECT * FROM job_images";
    $res = mysqli_query($con, $sql);
     
    echo round(memory_get_usage()/(1024*1024),2)." Mo<br />";
    while ($tab = mysqli_fetch_object($res)) { //MYSQL_NUM
    }
    echo round(memory_get_usage()/(1024*1024),2)." Mo<br />";
    mysqli_close($con);
    Avec environ 60000 lignes, résultat :

    Avant : 2.11 Mo
    Après : 16.23 Mo

    Ce qui ma foi m'a l'air d'être tout à fait cohérent...
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #28
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Citation Envoyé par Aurélien LEQUOY Voir le message
    J'ai réduit le code à :


    [code]
    $con = mysqli_connect("91.***.***.***", "a*******", "Ar******", "a*******");
    Bonsoir,

    j'espère que les infos données ne sont pas les vrai sinon n'importe qui peut maintenant accéder aux données de ton serveur !!! (J'ai mis des étoiles au cas où la quote ne serais pas mise à jour quand tu enlèvera ces infos de ton post originel).

    Ensuite pourquoi ne pas fragmenter ton export en petit bout. Si dans ta BDD tu a 50 000 enregistrement, tu découpe l'export en pack de 5 000 enregistrements (ou plus suivant la place en RAM de dispo). Il suffit de fait un COUNT(*) avant de commencer pour savoir le nombre d'enregistrement et faire en fonction du nombre.

    EDIT : L'opérateur ^ ne correspond pas à une puissance mais à un XOR
    une réponse vous a permis d'avancer ?

  9. #29
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    La bibliothèque mysqlnd disponible depuis PHP 5.3, utilise la gestion de mémoire de PHP.
    Et effectivement chaque "fetch" est stocké en mémoire par mysqlnd et donc la mémoire comptabilisée par PHP augmente.
    C'est certes mal fichu au final mais c'est comme ça.

    Par parcourir un grand jeu de résultat on peut utiliser mysqli_use_result :
    http://www.php.net/manual/fr/mysqli.use-result.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #30
    Membre habitué
    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
    Points : 172
    Points
    172
    Par défaut
    Exia93

    => pour les param de connexion rien a faire (j'ai quand même changer le passwd), une vm monté à la volé qui est déjà plus de ce jour.

    effectivement pour le ^ :p


    Merci Sabotage pour les infos .

    Spartacusply, fait un test avec 120000 lignes tu vas voir que ça double.


    le but est de traité des millions/milliards de lignes ...

  11. #31
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Avez tester de découper vos 120 000 lignes en petit groupe (10 000 lignes par exemple) ?

    Sinon il faut utiliser des outil tels que mysqldump et envoyer le fichier par php.
    une réponse vous a permis d'avancer ?

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, 11h41
  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, 11h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 13h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 22h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 18h20

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