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 :

acceder a la quantite de RAM en C/C++


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut acceder a la quantite de RAM en C/C++
    salut a tous,

    j'ai besoin de parametrer mon prog en fonction des capacites memoire de l'engin sur lequel il va tourner...

    comment acceder a ce score?

    en C de pref, en C++ sinon...

    merci a tous.

  2. #2
    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 : 68
    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 Re: acceder a la quantite de RAM en C/C++
    Citation Envoyé par yop solo
    j'ai besoin de parametrer mon prog en fonction des capacites memoire de l'engin sur lequel il va tourner...

    comment acceder a ce score?

    en C de pref, en C++ sinon...
    Ce n'est pas une question de langage, mais de système. Chaque système a les fonctions qui vont bien. Il n'y a rien de standard. Il faut reposter sur le forum dédié à ton système.

    Sur le plan de la conception, la "capacité mémoire" est quelquechose de vague. En effet, il peut s'agir de mémoire physique installée (mais pas forcément disponible). Il paut aussi s'agir de la mémoire adressable, étendue (sur disque) etc. Bref, l'information reçue n'est pas forcément très exploitable...

    Le mieux est travailler en dynamique, et de tester le retour de malloc(). Si il vaut NULL, c'est que la mémoire n'était pas disponible au moment de la demande. Elle pourrait très bien l'être un peu plus tard, ou en arrêtant d'autres programmes en cours d'exécution...

  3. #3
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 345
    Points : 130 264
    Points
    130 264
    Billets dans le blog
    1
    Par défaut Re: acceder a la quantite de RAM en C/C++
    Citation Envoyé par Emmanuel Delahaye
    Il faut reposter sur le forum dédié à ton système.
    Ou au moins le préciser dans le post !

    Citation Envoyé par Emmanuel Delahaye
    Le mieux est travailler en dynamique, et de tester le retour de malloc(). Si il vaut NULL, c'est que la mémoire n'était pas disponible au moment de la demande. Elle pourrait très bien l'être un peu plus tard, ou en arrêtant d'autres programmes en cours d'exécution...
    Oui, mais sur certains systèmes comme Linux suivant une stratégie d'allocation optimiste, se baser sur l'assertion "malloc réussit = suffisamment de mémoire" peut amener à beaucoup de mauvaises surprises (swapping intense, puis processus tué par EDOM, l'éliminateur de processus gourmands en mémoire).

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    nan je peut apas jouer du malloc...

    l'exec du prog dure 2heure et je voudrais savoir au debut combien je peut allouer a ma memoire et faire donc ces deux heure de calcul en fonction.

    a moins de lancer une boucle bidon pour tester la qt dispo...

    bref, comment je doit faire pour savoir la ram totale embarquee ou mieux c vrai celle qui reste...

    a la maniere du vue-mettre c vrais que ca serait pas mal...

    en java je sais qu'il y a une classe sy stem...
    en c j'ai trouve <stdlib.h> : system qui pourrait me renvoyer par l'intermediaire d'une commande en shell la RAM dispo...

    qlql connaitrait il une autre methode?

    comment fonctionne le vue-mettre?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    oui pardon complet...

    je suis sous linux

  6. #6
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 345
    Points : 130 264
    Points
    130 264
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yop solo
    oui pardon complet...
    je suis sous linux
    Merci pour cette info capitale

    Il faut lire le pseudo-fichier /proc/meminfo, il contient les informations essentielles pour la mémoire. Bien entendu, il faudra l'analyser et le parser.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    bah j'ai pas le niveau!

    je ne trouve pas ce fichier /proc/meminfo

    et kesako et kestentanpar analyser et parser

    ?

  8. #8
    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 : 68
    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 Re: acceder a la quantite de RAM en C/C++
    Citation Envoyé par Anomaly
    Oui, mais sur certains systèmes comme Linux suivant une stratégie d'allocation optimiste, se baser sur l'assertion "malloc réussit = suffisamment de mémoire" peut amener à beaucoup de mauvaises surprises (swapping intense, puis processus tué par EDOM, l'éliminateur de processus gourmands en mémoire).
    Mauvais noyau, changer de noyau !

  9. #9
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 345
    Points : 130 264
    Points
    130 264
    Billets dans le blog
    1
    Par défaut Re: acceder a la quantite de RAM en C/C++
    Citation Envoyé par Emmanuel Delahaye
    Mauvais noyau, changer de noyau !
    Si tu y tiens, ce défaut de conception a été corrigé dans Linux 2.6 il me semble. C'est à vérifier.

    yop solo> Essaye un cat /proc/meminfo sous la console ! Sinon tu as quel Linux (version du noyau, distrib) ? (uname -a pour savoir la version du noyau)

  10. #10
    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 : 68
    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 Re: acceder a la quantite de RAM en C/C++
    Citation Envoyé par Anomaly
    Citation Envoyé par Emmanuel Delahaye
    Mauvais noyau, changer de noyau !
    Si tu y tiens, ce défaut de conception a été corrigé dans Linux 2.6 il me semble. C'est à vérifier.
    C'est ce que j'avais cru comprendre. Mais je ne suis pas du tout spécialiste de Linux.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    resultat de uname -a:
    2.4.18-3 #1 Thu Apr 18 07:37:53 EDT 2002 i686 unknown

    en ksh...

    que dire de plus...


    cat /proc/meminfo me donne toutes les infos utiles.

    comment recuperer une de ces variables?

    p ex est ce que memfree necessite juste un system("memfree") de la classe stdlib ?

    merci deja de m'avoir permi d'avancer jusque la...

  12. #12
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    resu de cat /proc/meminfo:


    MemTotal: 1031400 kB
    MemFree: 604016 kB
    MemShared: 0 kB
    Buffers: 23592 kB
    Cached: 200008 kB
    SwapCached: 33308 kB
    Active: 289188 kB
    Inact_dirty: 103304 kB
    Inact_clean: 3108 kB
    Inact_target: 79120 kB
    HighTotal: 130944 kB
    HighFree: 1024 kB
    LowTotal: 900456 kB
    LowFree: 602992 kB
    SwapTotal: 514068 kB
    SwapFree: 364624 kB
    Committed_AS: 351508 kB
    mem lib0


    je voudrais recuperer la valeur memFree directement...

    je doit diriger le flux, ecrire et lire en comptant les espaces et convertir en int ou bien....?

  13. #13
    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 : 68
    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 yop solo
    resu de cat /proc/meminfo:

    MemTotal: 1031400 kB
    MemFree: 604016 kB
    MemShared: 0 kB
    Buffers: 23592 kB
    Cached: 200008 kB
    SwapCached: 33308 kB
    Active: 289188 kB
    Inact_dirty: 103304 kB
    Inact_clean: 3108 kB
    Inact_target: 79120 kB
    HighTotal: 130944 kB
    HighFree: 1024 kB
    LowTotal: 900456 kB
    LowFree: 602992 kB
    SwapTotal: 514068 kB
    SwapFree: 364624 kB
    Committed_AS: 351508 kB
    mem lib0

    je voudrais recuperer la valeur memFree directement...

    je doit diriger le flux, ecrire et lire en comptant les espaces et convertir en int ou bien....?
    Il suffit d'ouvrir le fichier "/proc/meminfo" en mode texte (fopen() avec "r"), de lire les lignes (fgets()) et de parser celle qui contient "MemFree" de façon à déterminer la valeur (strtoul()). Je ne vois pas de difficulté majeure.

    Poste le code si il ne fonctionne pas.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    je poste la reponse pour les generations futures...

    j'espere que personne ne l'avait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream.h>
     
    int main(void) {
      cout<<"mem lib :"<<system("grep MemFree /proc/meminfo")<<endl;
      return 0;
    }
    merci pour tout

    [Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]

  15. #15
    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 : 68
    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 yop solo
    #include <iostream.h>
    <...>
    cout<<"mem lib :"<<system("grep MemFree /proc/meminfo")<<endl;
    Pas du C. (et du mauvais C++ : #include <iostream>)

  16. #16
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    oups j'avais pas vu ta repopnse emmanuel...
    toute mes confuses...

    heu, C++, c'est juste pour les cout??

    desole pour le jargon mais que veut dire parser?

    mais qd on sait c'est jamais dur au fait...

    en gros tu preconise un truc genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    void main(void) {
      FILE *file = fopen("/proc/meminfo","R");
     
      fgets(int ligne);
     
    // c'est la qu'il faut parser... char* ligne -----> char * memlib
     
      int mem = strtoul(memlib)
     
      fclose(file);
    }

  17. #17
    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 : 68
    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 yop solo
    heu, C++, c'est juste pour les cout??
    Oui, et iostream. Rien de tel en C. Je rappelle que C et C++ sont des langages différents qu'il convient de ne pas mélanger.
    desole pour le jargon mais que veut dire parser?
    Désolé pour le franglais. 'to parse' : analyser. Pour une chaine de caractère, chercher les mots cles, séparateurs, valeurs etc. de façon à en extraire des données.
    en gros tu preconises un truc genre:
    <...>
    Oui...

  18. #18
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    j'ai absoluement pas tout resolu!

    en fait ne reussisant pas a chopper ma variable avec getc (aurais tu un site clair recenssant toute les fonctions de base a proposer), j'ai chercher a continuer dans ma voie de depart et je suis tombe sur d'autre pb....

    raz le c..

    j'en suis a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       int mem_new;
      char* mymem = (char *)malloc(10);
      printf("test1: %s\n",mymem);
     
      system("export MYMEM=`grep MemFree /proc/meminfo | awk '{print $2}'`");
      printf("La RAM libre est de: %s.", getenv("MYMEM"));
      cout<<"mem_new="<<mem_new<<endl;
      system("echo test2 $MYMEM");
    le pb de system() c'est qu'il affiche directement le resulttat... pas de variable... pas de resultat...

    je met du cout juste pour me simplifier la vie dans mes test, je lle traduirait en C...

    en fait j'arrive pas a parser.... bouhouhou....

    [Balises [CODE] ajoutées par gl, merci d'y penser à l'avenir]

  19. #19
    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 : 68
    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 yop solo
    j'ai absoluement pas tout resolu!

    en fait ne reussisant pas a chopper ma variable avec getc (aurais tu un
    Qui a parlé de getc() ?

    Essaye ça. (Ca fonctionne chez moi sous DOS. Comme je n'ai pas Linux, j'ai simulé en créant un fichier texte 'meminfo' comme le tien dans un repertoire /proc.)

    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define FNAME "/proc/meminfo"
     
    int main (void)
    {
       FILE *fp = fopen (FNAME, "r");
     
       if (fp != NULL)
       {
          char sline[64];
     
          /* lire le fichier lignes a lignes */
          while (fgets (sline, sizeof sline, fp) != NULL)
          {
             /* chercher le mot cle */
             char *p = strstr (sline, "MemFree");
     
             if (p != NULL)
             {
                /* chercher un separateur apres le mot cle */
                while (!isspace (*p) && *p)
                {
                   p++;
                }
     
                /* on en a trouv‚ un, on peut convertir la suite */
                if (*p)
                {
                   unsigned long memfree = strtoul (p, NULL, 10);
     
                   printf ("memfree = %lu kB\n", memfree);
                }
     
                /* recherche terminee, on quitte (proprement) */
                break;
             }
          }
     
          fclose (fp);
          fp = NULL;
       }
       else
       {
          perror (FNAME);
       }
     
       return 0;
    }

  20. #20
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 29
    Points : 27
    Points
    27
    Par défaut
    exellent...

    merci emmanuel...

    il manque juste l'include de ctype.h et ca marche au poil.

    cette solution me va hachement mieux pasqu'elle ne force pas a s'adapter au type de shell pour les commande que j'utilisait... il me fallait prevoir un case incluant les different ksh, sh , csh, kkztr5bsh, duttnnnnsiisdbsh...

    en gros merci !

    j'ai reve ou t'a pris une etoile au fait?

    bonne continuation et encore merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Déterminer la quantité de RAM utilisée
    Par lenetfm dans le forum Débuter
    Réponses: 6
    Dernier message: 21/04/2008, 20h07
  2. Quantité de RAM en excès
    Par 3psilOn dans le forum Windows XP
    Réponses: 2
    Dernier message: 10/02/2008, 20h12
  3. [vb.net] trouver la quantité de RAM installée
    Par tbdarkspirit dans le forum VB.NET
    Réponses: 3
    Dernier message: 08/04/2007, 15h44
  4. Comment connaitre la quantité de RAM libre ?
    Par progfou dans le forum Visual C++
    Réponses: 9
    Dernier message: 06/03/2007, 18h30
  5. Vitesse du CPU, quantité de RAM... en C
    Par dclink dans le forum C
    Réponses: 4
    Dernier message: 07/07/2003, 20h48

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