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

C Discussion :

Taille du résultat de mysql_store_result()


Sujet :

C

  1. #1
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut Taille du résultat de mysql_store_result()
    Hello,

    je ne suis pas développeur C et ne me souviens que des rudiments du langage, donc veuillez m'excuser si ma question est "toute bete".

    Actuellement j'ai un code de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_result = mysql_store_result( xxx );
    J'aimerais tout "simplement" pouvoir récupèrer la taille occupée en mémoire par "my_result". Enfin... il my_result n'est qu'un pointeur vers un élément de type MYSQL_RES, si j'en crois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MYSQL_RES *mysql_result;
    Comment puis je procéder ?

    Je ne sais pas si cela peut aider, mais d'après la doc MySQL mysql_store_result() utilise malloc().

    Voilou, merci d'avance
    Google is watching you !

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    J'utilise souvent l'API MySQL et je pense pas qu'il y ait un moyen de connaitre la consommation mémore d'un result set obtenu avec mysql_store_result.
    Ce qui est sur c'est qu'un tel result set contient toutes les lignes du resultat du SELECT, donc tu dois pouvoir estimer la consommation à partir de la longueur des chaines dans chaque champ de chaque ligne.

  3. #3
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    mm, ça ne m'arrange pas vraiment
    En gros je dois faire un fetch de toutes les lignes pour incrementer un compteur de "sizeof()" sur chaque champ, c'est bien ça ?

    Cela me semble un peu lourd comme traitement
    Google is watching you !

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Kioob Voir le message
    mm, ça ne m'arrange pas vraiment
    Pourquoi as-tu besoin de la taille ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    J'ai une machine hébergeant de nombreux clients "gratuitement" (plusieurs milliers de sites), et forcément dans le tas il y a des scripts très mal codés à base de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $res = mysql_query( "select * from table_des_messages" );
    $nb_msg = mysql_row_nums( $res );
    Sur une table de 400Mo, cela fait des ravages ensuite coté Apache.

    L'idée est donc de modifier l'extension mysql de PHP afin d'y tracer ce genre de choses.
    Google is watching you !

  6. #6
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Dans tous les cas ce n'est pas sizeof qu'il faut utiliser sur les champs d'un MYSQL_ROW, ya fort à parier que MYSQL_ROW n'est qu'un "char **". Donc "sizeof(row[n])" ne renverrait certainement pas une information interessante.

    Par contre "strlen(row[n]) + 1" oui, mais pas forcément... il n'est pas dit que ce qui contient les chaines dans les champs de chaque MYSQL_ROW occupent juste ce qu'il faut pour y faire tenir la valeur (ça pourrait être plus)

    Et de toute façon, si on ne compte que les longueurs des chaines, il manque également la taille des MYSQL_ROW eux meme, et d'autres données internes. Ca serait qu'une estimation.
    A moins d'analyser la structure interne des MYSQL_RES et MYSQL_ROW, je pense que c'est pas possible, et même ce ne serait pas une bonne idée car susceptible de changer entre les versions de MySQL

  7. #7
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    D'un autre coté, si j'ai une estimation à + ou - 10%, ça me va déjà très bien.

    Si je peux repérer tous les scripts qui chargent plus de 5Mo de données en mémoire, je serais déjà heureux
    (j'ai déjà tenté du coté de la fonction PHP memory_get_peak_usage(), mais la mémoire allouée aux résultats MySQL n'y est pas compté)
    Google is watching you !

  8. #8
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    J'ai peut être une piste... pas forcément idéale non plus mais :
    dans MYSQL_RES il y a "data" de type MEM_ROOT, qui pointe à priori sur une liste chainée de blocs mémoires. Et pour chacun la taille est indiquée.

    J'ai également trouvé dans les sources mysql un exemple de code parcourant cette liste en un seul "for". Je tente de compiler ça (j'ai encore un peu de mal), et je verrais ce que ça donne...


    PS : et si ça ne fonctionne pas je me contenterais du "row_count", qui évitera déjà quelques soucis
    Google is watching you !

  9. #9
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Et bien cela fonctionne. Avec "mysql_result" étant de type MYSQL_RES ( retourné par la fonction mysql_store_result() ) cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            MYSQL_DATA *data;
            MEM_ROOT alloc;
            USED_MEM *next;
     
            unsigned int result_size;
     
            data = mysql_result->data ;
            alloc = data->alloc ;
     
            result_size = alloc.block_size ;
            for (next = alloc.used; next; next= next->next )
            {
                result_size += ( next->size - next->left );
            }
    Voila, je ne sais pas si le résultat est exact à l'octet près, mais il est très très proche de ce que je cherchais (et en l'occurance, le script PHP dont je parlais bouffe bien 440Mo).
    Google is watching you !

  10. #10
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Ca m'interesse, merci
    Cela dit, ca va un peu à l'encontre de la philosophie des types abstrait où on est pas senser fouiller dans la structure interne des objets.

  11. #11
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Entièrement d'accord, et j'avoue que j'aurais préféré faire autrement

    Là en cas de changement de "format interne" coté MySQL, je me retrouve avec un client qui ne compile plus, alors que c'est normalement indépendant.
    Google is watching you !

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

Discussions similaires

  1. Taille du résultat d'une sélection avec filtres
    Par Marims dans le forum Excel
    Réponses: 20
    Dernier message: 20/05/2015, 09h44
  2. Réponses: 1
    Dernier message: 12/12/2010, 23h26
  3. [SQL-Server] Taille limite des résultats d'une requête
    Par AllezTFC dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/05/2008, 21h03
  4. Connaitre la taille du résultat de sprintf
    Par gege2061 dans le forum C
    Réponses: 6
    Dernier message: 09/01/2006, 14h56
  5. Taille résultat requete
    Par guano dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/07/2005, 23h24

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