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

Dev-C++ Discussion :

[Devcpp] Programme qui mange de la mémoire


Sujet :

Dev-C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut [Devcpp] Programme qui mange de la mémoire
    Bonjour,
    J'aimerai avoir votre avis sur les différentes cause qui peuvent amener un programme a manger de la mémoire sur le systeme inutilement.(mon programme mange 300Mo de Mem vive en l'espace de quelques heures ...)

    je n'ai fait aucun New dans ces lignes de codes donc aucun delete, dans la boucle de mon programme il n'y a aucune declaration de variable.

    par contre dans ma boucle infini, il y a des appels de fonction dans lesquel, j'y declare des variables.

    Ma question est donc, est il possible qu'a chaque fois qu'une de mes fonction est appelée la mémoire alloué par cette fonction ne soit pas libéré a la fin de celle si ? (ils s'agit de declaration du genre string test, etc...)

    voici le code pour les curieux, il s'agit d'un prog qui va chercher ds une base une liste de reseaux, qui va les ping, et qui va ecrire le resultat ds la base, et tout sa en tournant en boucle.
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    #include <winsock.h>
    #include <windows.h>
    #include <iostream>
    #include <string.h>
    #include <sstream>
    #include <mysql/mysql.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    using namespace std;
    //Declaration des fonctions
    string ping (string ip);
    int net_send (string message);
    string test_derniere_reponse (string ip);
     
    //debut du programme
    int main()
    {
     
        unsigned int       nombres_champs    = 0;                
        std::string        affiche_site      = "";                 // le resultat de la requete SQL correspondant a la colonne site de la ligne selectionée
        std::string        affiche_ip        = "";                 // le resultat d ela requete SQL correspondant a la colonne IP de la ligne selectionée
        std::string        reponse_ping      = "";                 // la variable qui stockera le resultat de la fonction ping
        std::string        requete           = "";                 // la requete SQL pour la 1 ere session
        std::string        update_requete    = "";                 // la requete SQL pour la 2 eme session
        std::string        temp_requete      = "";                 // une variable temporaire pour bidouiller les requetes SQL
        std::string        message_net_send  = "";                 // notre variable pour faire passer un message a la fonction net send
        int                y                 = 0;                  // permettra d'avoir un identifiant de ligne lors d'une selection SQL Multiple    
     
    //declaration des variables pour la bdd qui contient les infos reseaux
        /* const*/ std::string host          = "localhost";
        /* const*/ std::string  user         = "root";
        /* const*/ std::string  pass         = "manager";
        /* const*/ std::string  db           = "osiris";
     
        MYSQL      *                           sock ;                                        //Creation d'un string afin de permettre une saisie plus facile
        MYSQL_RES  *                           reponse;                                   //un pointeur sur la reponse SQL
        MYSQL_ROW                              ligne;                                      //pour lire le les resultats !
     
    //declaration des variables pour la bdd qui contient les temps de réponse;
        /* const*/ std::string update_host  = "localhost";
        /* const*/ std::string  update_user = "root";
        /* const*/ std::string  update_pass = "manager";
        /* const*/ std::string  update_db   = "osiris";
     
        MYSQL      *                           update_sock ;    
     
    //Initialisation de la connexion a la base qui stock les infos reseaux;                                                        
        sock = mysql_init(0);                                                     
        if (sock) cout << "Initialisation de la connexion Ok !" << "\n";                  
        else {
             cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
             }
    //Initialisation de la connexion a la base pour mettre a jour les temps de réponse;
        update_sock = mysql_init(0);
        if (update_sock) cout << "Initialisation de la connexion Ok !" << "\n";
        else
             {
              cout << "Erreur lors de l'initialisation de la connexion : " << mysql_error(update_sock) << "\n";           
             }         
    //connection pour recolter les infos reseau
        if (mysql_real_connect(sock, host.c_str(), user.c_str(), pass.c_str(), db.c_str(), 0, NULL, 0))   // Connection a la BDD avec pour parametres : sock = identificateur de la connexion, bufferhost = adresse IP de la machine, bufferuser = login de connexion a la base, bufferpass= pass de connection a la base, "" = nom de la base de donnée a selectionner (on peut par la suite faire un " USE ma_base; "
             cout << "connection ok, sur la bdd : " << db << "\n";
        else 
        {
             cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
        }
    //connection pour mettre a jour les temps de reponses
        if (mysql_real_connect(update_sock, update_host.c_str(), update_user.c_str(), update_pass.c_str(), update_db.c_str(), 0, NULL, 0))   // Connection a la BDD avec pour parametres : sock = identificateur de la connexion, bufferhost = adresse IP de la machine, bufferuser = login de connexion a la base, bufferpass= pass de connection a la base, "" = nom de la base de donnée a selectionner (on peut par la suite faire un " USE ma_base; "
             cout << "connection ok, sur la bdd : " << db << "\n";
        else 
        {
             cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
        }
     
    //execution d'une requete
    /* cout << "requete ? " ;               
    getline( cin, requete );      */                                
    requete = "select site,ip from annuaire_reseau;";
     
    cout << requete.c_str();
    /* *****************************************************************
    *                                                                  *
    *                       Debut de la Boucle                         *                                      
    *                                                                  *                                      
    ********************************************************************/
    while (1)
    {
    if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
        else 
        {
        cout << "requete faite !\n" << endl;       
        reponse = mysql_use_result(sock);
        nombres_champs = mysql_num_fields(reponse);
        while ((ligne = mysql_fetch_row(reponse)))        //Tant qu'on a une ligne de selectionnée
                {
                   y++;
                   // selection de la ligne et affichage de ce que l'on va tester
                        affiche_site = ligne[0]; 
                        affiche_ip   = ligne[1];  
                        cout << "Connexion a : "<< affiche_site << " "<< "\"" << affiche_ip << "\"   ";
                   //test reseau
                        reponse_ping = ping (affiche_ip);
                        cout << reponse_ping;
                        if (reponse_ping == "offline")  //si le reseau ne repond pas on va envoyer un message si derniere_reponse = 0 et modifier la base en conséquence
                            reponse_ping = ping (affiche_ip);
                        if (reponse_ping == "offline")
                        {
                                         if(test_derniere_reponse (affiche_ip)=="0")
                                         {
                                          message_net_send = "Le site de : " + affiche_site + " ayant pour passerelle : " + affiche_ip + " ne repond plus";                                    
                                          net_send(message_net_send);                                                          
                                          update_requete = "update annuaire_reseau set derniere_reponse = now() where ip = '" + affiche_ip + "';";
                                          mysql_query(update_sock,update_requete.c_str()); 
                                         }
                                         else
                                         {
                                             // on est deja au courant on ne touche pas a la date et on n'envoie pas de messages.
                                         }
     
                        }
                        else                 //si le reseau repond on verifie qu'avant il repondait bien sinon on averti user que le reseau est retabli, la base sera modifié en conséquence
                        {
                                          if(test_derniere_reponse (affiche_ip)=="0");
                                          else
                                          {
                                           message_net_send = "Le site de : " + affiche_site + " ayant pour passerelle : " + affiche_ip + " est a nouveau disponible";                                    
                                           net_send(message_net_send);
                                           update_requete = "update annuaire_reseau set derniere_reponse = '0' where ip='"+ affiche_ip +"';";
                                           if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";   
                                          }                                       
                        }
     
                   // update du temps de réponse
                   update_requete = "update annuaire_reseau set PING = \"";
                   temp_requete = "\" where ip= '" + affiche_ip;
                   update_requete = update_requete + reponse_ping + temp_requete +"';";
                   if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
                   cout << endl;
                }  
        }  
    }       
    //Pause !
        system("PAUSE"); 
    //Fermeture de la connection a la BDD
        mysql_close(sock);
        mysql_close(update_sock);
        return EXIT_SUCCESS;
    }
    /*
    Fonction pour ping, qui va renvoyer le temps de reponse de l'@ IP renseignée
    Pour ce faire on va faire un ping windows ou l'on va sauvegarder notre resultat 
    dans un fichier tempY (avec y = identifiant de ping), ensuite on valire notre 
    fichier et y trouver ou pas un temps de reponse et renvoyer ce dernier, si aucun 
    temps de réponse n'est retrouvé on renvoie offline
    */
     string ping (string ip)
    {
            int                      result      = 1;
            bool                     booltest    = false;
            char                     test[50];
            std::string              tests;
            std::string              ping_id;
            std::string              fichier = "temp";
            std::string              commande = "";
            std::ostringstream       oss;
            FILE *                   temp;
     
      commande = commande + "ping " + ip + " -n 1 -w 800 > temp" + ping_id;
      system(commande.c_str()); 
      temp = fopen (fichier.c_str(),"r");  
     while (!feof (temp))
           {
           fscanf (temp,"%s",test);
           if (booltest == true)
             {
                     booltest = false;
                     tests.assign(test);
                     fclose(temp);
                     return tests; 
             }
           if (strcmp (test,"bytes=32") == 0)
             {
                     booltest = true;
             }
     
           if (strcmp (test,"out.") == 0)
              {
                     result = 0;
              }
           }
     fclose(temp);
     tests.assign(test);
     tests = "offline";
     return tests;
    }
    /*
    une fonction qui envoie un message a l'utilisateur, le message est passé en 
    parametres sous la form d'un char
    */
    int net_send (string message)
    {
        string commande = "net send moisan.j ";
        commande = commande + message + " > save_net_send.txt";
        system(commande.c_str());
        return 1;
    }
    /*
    Voici notre fonction qui va rechercher dans notre table annuaire_reseau la valeur 
    de la colonne derniere_reponse et la retourner.
    */
    string test_derniere_reponse (string ip)
    {
        std::string         affiche         = "";
        std::string         requete         = "";
        unsigned int        nombres_champs  = 0;   
        char *              host            = "localhost";
        char *              user            = "root";
        char *              pass            = "manager";
        char *              db              = "osiris";
        MYSQL *             sock ;
        MYSQL_RES *         reponse;                                
        MYSQL_ROW           ligne;   
        //initialisation
        sock = mysql_init(0);                                                      // on initialise la connexion a la base de donnée
        if (sock);                  
        else {
             cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
             }
        //connection
        if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0)); 
        else 
        {
             cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
        }
        //la requete
        requete = "select derniere_reponse from annuaire_reseau where ip='"+ip+"';";                      
        //execution de la requete
        if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
        else 
        {         
        reponse = mysql_use_result(sock);
        nombres_champs = mysql_num_fields(reponse);
        while ((ligne = mysql_fetch_row(reponse)))        //Tant qu'on a une ligne de selectionnée
                {
                        affiche = ligne[0];            // on stock le resultat de notre 1 ere case ds affiche  
                }  
        } 
     mysql_close(sock);
     if (affiche != "0"  )
     {
                 return affiche;
     }
    else
     { 
                 return "0";
     }            
    }

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu as des pointeurs qui sont renvoyés directement par l'API MySQL (sock, ligne, reponse), vérifie dans la doc si tu ne dois pas libérer toi-même la mémoire qui est au bout.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Par défaut
    Ajoute peut-etre un mysql_free_result(reponse) à la fin de ta boucle, ou quelque chose comme ca. J'ai pas regardé dans le detail, mais tu libere jamais la memoire alloué pour la reponse apparement.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut
    Oui je n'avais pas pensé a liberer cette mémoire la, je pensait qu'a chaque nouvelle requete cela ecrasait la précédente.

    j'ai placé mon mysql_free_result(reponse); a la fin de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                   // update du temps de réponse
                   update_requete = "update annuaire_reseau set PING = \"";
                   temp_requete = "\" where ip= '" + affiche_ip;
                   update_requete = update_requete + reponse_ping + temp_requete +"';";
                   if (mysql_query(update_sock,update_requete.c_str()))cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
                   cout << endl;
                }
                mysql_free_result(reponse);  
        } 
    }
    j'ai fait des tests sur 15 min => mon prog a consommée 15 mo de memoire vive ce qui me parrait tres gros. je lance mon prog pendant une petite heure et je vais voir.
    ce qui est de la 2 eme connexion SQL utilisée dans le programmes je ne fait pas de free etant donnée qu'elle ne fait aucun select, elle ne sert qu'a faire des updates.

    merci de votre attention a mon probleme et de vos réponses.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 51
    Par défaut Traque fuite mémoire...
    Microsoft met à votre disposition un utilitaire TRES sympathique pour traquer les fuites mémoires.

    Il s'agit des Debug Diagnostic Tools, pour l'utiliser il vous faudra juste générer le(s) fichier(s) PDB correspondant à votre projet.

    vous pouvez récupérer ce programme ici

    Ce programme vous informera rapidement sur la ligne (tant qu'à faire) de code qui génére la fuite mémoire.

    Cordialement

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut
    le mysql free_result n'a pas resolu le probleme le programme viens de manger 33Mo de memoire vive en 10 minutes.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Par défaut
    Oui, ce que j'ai dit n'etait qu'une piste possible, je ne me rappelle plus comment la memoire est gerer avec la lib mysql, mais comme tu as dis la logique voudrait que les resultat soient ecrasé à chaque fois.

    J'ai repassé en revu ton code, y'a rien qui me parait trop louche.
    T'as un truc bizar, mais ca n'a rien a voir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           if (booltest == true)
             {
                     booltest = false; << pourquoi ??
                     tests.assign(test);
                     fclose(temp);
                     return tests; 
             }

    C'est sur tu va ni gagner du temps, ni de l'espace avec ca


    Edit:
    Par contre, tu peux mettre le my_sql_free(reponse) dans test_derniere_reponse, car la tu creer A CHAQUE FOIS un MYSQL_RES, ca doit donc provenir de la, vu que tu libere jamais.


    Essaye:
    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
     
    string test_derniere_reponse (string ip)
    {
        std::string         affiche         = "";
        std::string         requete         = "";
        unsigned int        nombres_champs  = 0;   
        char *              host            = "localhost";
        char *              user            = "root";
        char *              pass            = "manager";
        char *              db              = "osiris";
        MYSQL *             sock ;
        MYSQL_RES *         reponse;                                
        MYSQL_ROW           ligne;   
        //initialisation
        sock = mysql_init(0);                                                      // on initialise la connexion a la base de donnée
        if (sock);                  
        else {
             cout << "ERREUR lors de l'initialisation de la connexion : " << mysql_error(sock) << "\n";
             }
        //connection
        if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0)); 
        else 
        {
             cout << "Echec de connection a la base de donnee : " << db << mysql_error(sock) << "\n";
        }
        //la requete
        requete = "select derniere_reponse from annuaire_reseau where ip='"+ip+"';";                      
        //execution de la requete
        if (mysql_query(sock,requete.c_str())) cout <<"echec de la requete, motif : \n" << mysql_error(sock) << "\n";
        else 
        {         
        reponse = mysql_use_result(sock);
        nombres_champs = mysql_num_fields(reponse);
        while ((ligne = mysql_fetch_row(reponse)))        //Tant qu'on a une ligne de selectionnée
                {
                        affiche = ligne[0];            // on stock le resultat de notre 1 ere case ds affiche  
                }  
        } 
    mysql_free_result(reponse);   // AJOUT
     mysql_close(sock);
     if (affiche != "0"  )
     {
                 return affiche;
     }
    else
     { 
                 return "0";
     }            
    }

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut
    cette fonction a été modifié a plusieurs reprises, cette ligne de code est inutile en effet, car je sort de la boucle while avec le return qui suit, et donc plus de test sur cette valeur donc cela ne sert a rien de la reinit avant de sortir vu que c'est une variable locale a la fonction.

    (dans une version précédente de la fonction il n'y avait pas de return, la boucle s'executait jusqu'a la fin de la lecture du fichier, hors avec une nouvelle version de la fonction je retourne le resultat des que j'ai lu ce qui m'interessait dans le fichier, sans finir de le lire)

    je regarde encore et encore je ne voit pas comment expliquer cette espace mémoire qui grossit. 3Mo par minute sa me parait enorme pour un petit programme comme sa (la requete SQL ramene juste 180 lignes environ pour 2 champs)

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut
    je viens de voir ton edit, je teste ! , j'avais oublié que j'utilisai une 3 eme connection dans cette fonction , j'ai la mémoire courte!!!

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut
    sa a l'air de marcher, plus de fuite, => test sur 10 min => lorsque je le ferme sa me libere 4 Mo a peu pres contrairement aux 30 de tout a l'heure (en 10 min).
    Je ferais un test demain matin sur plusieurs heures et je vous tiens au courant.

    sinon guillaumemarques merci pour ton soft surtout qu'il a l'air gratuit je vais regarder sa aussi sa peut servir a l'avenir.

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 86
    Par défaut
    Apres un certains temps de test, j'ia pu constater la nette amélioration de l'espace memoire alloué a mon programme !
    Le faite de liberer la mémoire des requetes SQL a apparament reglé le probleme.

    donc on retiendra qu'il faut bien faire apres chaque mysql_use_result(), un mysql_free_result(), car la mémoiré alloué précédemment n'est pas écrasé par un nouveau mysql_use_result contrairement a ce que l'on peut penser, meme si il s'agit du meme MYSQL_RES *.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Par défaut
    J'ai repensé à ca hier soir, je pense que tu peux enlever le premier que je t'avais dis de mettre.
    A mon avis, dans ce cas ca pose pas de probleme, est l'espace alloué pour les resultat sera toujours le meme utilisé. Dans le cas de ta fonction, tu faisais à chaque fois un nouvel espace.

    Donc le premier me semble obsolete ( mets le à la sortie de ta boucle.... ou ne le mets pas, vu que ta boucle est infinie), enfin ca te permettra juste de gagner quelque microsecondes à chaque passage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LG]programme qui renomme des fichiers
    Par Ne0taku dans le forum Langage
    Réponses: 9
    Dernier message: 16/02/2005, 21h18
  2. programme qui consomme beaucoup de memoire
    Par gaut dans le forum Windows
    Réponses: 10
    Dernier message: 01/02/2005, 20h33
  3. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27
  4. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38
  5. Recherche programme qui convertit les chiffres arabes en nb
    Par oli57 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2002, 03h11

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