Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1094 connectés 

  FORUM HardWare.fr
  Programmation

  place mémoire dispo en C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

place mémoire dispo en C++

n°13389
darthbob
www.laprise.org
Posté le 08-02-2001 à 14:30:18  profilanswer
 

Je voudrais savoir combien de mémoire est disponible pour allouer des variables...
 
Le but est de décider si je lance mon calcul ou pas (récursivité et tableaux dans tous les sens)
 
Qui peut m'aider ?


---------------
<a href="http://www.laprise.org">La prise</a> : mets les doigts dedans !
mood
Publicité
Posté le 08-02-2001 à 14:30:18  profilanswer
 

n°13424
la viper
Posté le 08-02-2001 à 16:54:28  profilanswer
 

si mes connaissances sont bonnes en variable locale tu peux avoir tous l'espace ram que tu veux.
pour les tableaux tu peux en faire autant que tu en veux en dynamique. .. 256 Mo de Donnée dans un tableau le pied  :)  
lol

n°13437
ColdCat
Posté le 08-02-2001 à 18:15:34  profilanswer
 

Si tu veut connaitre la taille de la memoire encore disponible cela depend du système, et de tes droits ( car un admin peut limiter l'usage de la memoire).
 
Un truc simple mais crade multiplatforme en c++. Tu essaye d'allouer un tableau de la taille que tu a besoin, si ca passe tu le libère et tu continu, et sinon tu le libère et tu ne lance pas ton calcul.

n°13467
z51
Posté le 08-02-2001 à 20:36:35  profilanswer
 

Sous Windows tu peux utiliser GlobalMemoryStatus avec en paramètre un MEMORYSTATUS.
T'auras des infos sur :
- la mémoire physique : totale et dispo
- la mémoire virtuelle : totale et dispo
 
En principe (mais je peux me gourer, j'ai jamais essayé à vrai dire) tu peux allouer au max la quantité de mémoire virtuelle dispo.

n°13480
darthbob
www.laprise.org
Posté le 08-02-2001 à 21:35:38  profilanswer
 

Merci pour les renseignements !
 
Je suis en Visual C++ sous Windows Nt (personne n'est parfait)
 
Donc mon problème est de connaître la mémoire RAM car mon calcul doit tourner le plus rapidement possible et peut être très long... Il est donc interdit de swaper !
 
Si vous avez d'autres idées...


---------------
<a href="http://www.laprise.org">La prise</a> : mets les doigts dedans !
n°13485
z51
Posté le 08-02-2001 à 22:27:39  profilanswer
 

eh bien ... GlobalMemoryStatus te donne ces infos justement :
 
mémoire physique totale = quantité de ram totale
mémoire physique dispo = quantité de ram libre

n°13510
BifaceMcLe​OD
The HighGlandeur
Posté le 09-02-2001 à 01:19:11  profilanswer
 

darthbob a écrit a écrit :

Merci pour les renseignements !
 
Je suis en Visual C++ sous Windows Nt (personne n'est parfait)
 
Donc mon problème est de connaître la mémoire RAM car mon calcul doit tourner le plus rapidement possible et peut être très long... Il est donc interdit de swaper !
 
Si vous avez d'autres idées...




Ca, par contre, tu ne pourras jamais le contrôler... car tu ne sais pas ce qui tourne à côté de ton programme, et qui a également besoin de mémoire comme lui. Donc ce n'est pas parce qu'à un moment donné, 60 Mo de RAM sont disponibles, que, si ton programme en prend 50, une partie de celle-ci ne sera pas elle-même swappée.
 
Par contre, si tu peux modifier ton algorithme, je te conseille de lui faire traiter des petits blocs de mémoire plutôt que de balayer de grandes zones de mémoire. C'est une optimisation très efficace même si au final on doit utiliser plus de mémoire. Car dans un cas, les petits blocs tiennent dans la mémoire cache du processeur alors que dans le second cas, le cache processeur ne sert quasiment à rien.
 
Pour donner un exemple, le programme SETI@home a été optimisé ainsi, et, avec une consommation globale de mémoire augmentée de 4%, le temps d'exécution du programme a pu être réduit d'environ 60 à 70% ! (et en plus, l'échauffement du processeur a été largement réduit lui aussi, mais ça, c'est ce qu'on appelle la cerise sur le gâteau).

 

--Message édité par BifaceMcLeOD--

n°13540
BENB
100% Lux.
Posté le 09-02-2001 à 09:35:05  profilanswer
 

coldcat a écrit a écrit :

Si tu veut connaitre la taille de la memoire encore disponible cela depend du système, et de tes droits ( car un admin peut limiter l'usage de la memoire).
 
Un truc simple mais crade multiplatforme en c++. Tu essaye d'allouer un tableau de la taille que tu a besoin, si ca passe tu le libère et tu continu, et sinon tu le libère et tu ne lance pas ton calcul.




 
Bof y'a plus crade encore tu alloue une zone de la taille voulue
tab = new sizeof(char[taille voulue]) approx
puis tu ne libere pas mais tu ecris dans cette zone...
Il n'y a plus qu'une seule allocation memoire...

n°13625
darthbob
www.laprise.org
Posté le 09-02-2001 à 16:11:59  profilanswer
 

J'ai testé GlobalMemoryStatus qui fonctionne bien mais je ne sais pas trop comment interpréter ses résultats:
 
J'obtiens:
 
dwMemoryLoad      =           100   // percent of memory in use  
dwTotalPhys;      =    66 195 456   // bytes of physical memory  
dwAvailPhys;      =         8 192   // free physical memory bytes  
dwTotalPageFile;  = 2 081 284 096 // bytes of paging file  
dwAvailPageFile;  = 1 895 481 344 // free bytes of paging file  
dwTotalVirtual;   = 2 143 289 344 // user bytes of address space  
dwAvailVirtual;   = 1 972 109 312 // free user bytes  
 
Pourquoi 100% d'utilisation alors qu'il reste 8 Mo libre ?
 
J'ai bien 64 Mo de RAM (66 195 456 octets)
 
Comment savoir combien d'octets restent en mémoire RAM pour mon appli ??? Le paging file, il vaut mieux pas que je m'en serve... Est-ce vraiment 8 Mo ?


---------------
<a href="http://www.laprise.org">La prise</a> : mets les doigts dedans !
n°13662
z51
Posté le 09-02-2001 à 20:36:58  profilanswer
 

D'après tes chiffres il reste 8Mo de ram "physique" libre.
Le MemoryLoad est faux, je crois que ça vient de 95/98 ...
Il indique aussi 2Go de mémoire virtuelle, ça tu peux le vérifier dans les paramètres de mémoire virtuelle de Windows.
 
En principe donc tu peux tabuler sur 8Mo. En principe il les allouera dans la ram physique, mais BiFaceMcLeod a raison, tu ne peux pas en être sûr à 100% (sauf si tu fixes la taille du swap à zéro, mais alors le moindre débordement et Windows va râler ...)

mood
Publicité
Posté le 09-02-2001 à 20:36:58  profilanswer
 

n°13693
darthbob
www.laprise.org
Posté le 10-02-2001 à 11:18:19  profilanswer
 

z51 > 8 Mo restant c'est pas beaucoup, mais il est vrai que la machine qui fera tourner le prog disposera de 128 ou 256 Mo...
 
Je vais donc baser mon algo sur la valeur de dwAvailPhys.
 
Merci !
 

 


--Message édité par darthbob--


---------------
<a href="http://www.laprise.org">La prise</a> : mets les doigts dedans !
n°13755
canada
Posté le 11-02-2001 à 16:44:32  profilanswer
 

darthbob a écrit a écrit :

Je voudrais savoir combien de mémoire est disponible pour allouer des variables...
 
Le but est de décider si je lance mon calcul ou pas (récursivité et tableaux dans tous les sens)
 
Qui peut m'aider ?




Pour le C++, tu utilise ta mémoire RAM, les variables ne prennent pas grand chose: exemple variable de type int= 2 octets

n°13970
BifaceMcLe​OD
The HighGlandeur
Posté le 12-02-2001 à 23:42:51  profilanswer
 

darthbob> Ca me rappelle un appel hot-line d'un utilisateur de Windows 3 peu après que cette version soit sortie. Le type disait "quand j'ouvre la boite de dialogue "A propos" du gestionnaire de programmes, il me dit "Mémoire disponible: 7 Mo". Mais j'en n'ai que 4, il ne marche pas, votre truc !!!". La réponse du support technique fut "Bienvenue dans le monde merveilleux de la mémoire virtuelle..."
 
Tout ça pour dire qu'il n'y a pas vraiment moyen de distinguer mémoire réelle et mémoire swappée. L'adressage de la mémoire swappée est même gérée au niveau du processeur !!!!
Et Windows, lorsqu'il prend "possession" de la machine, alloue toujours presque toute la mémoire disponible, quelle que soit la quantité de mémoire qu'il utilise réellement (et quelle qu'en soit la quantité disponible). Et c'est Windows qui, ensuite, distribue la mémoire aux applications. Tu peux mettre 1 giga ou 2 gigas de mémoire dans ton PC, tu n'auras toujours que 8 ou 16 kilooctets de mémoire libre sous Windows. Et de toute façon, ton programme ne pourra jamais utiliser ceux-là, puisqu'il passera toujours par Windows pour allouer de la mémoire !
 
Moralité : oublie, et repose sur ce que sait faire l'OS. De toute façon, si ton programme tourne prioritairement, la mémoire qu'il utilise ne sera pas swappée, car l'OS swappe ce qu'il n'utilise pas.

n°13971
BifaceMcLe​OD
The HighGlandeur
Posté le 12-02-2001 à 23:45:45  profilanswer
 

darthbob a écrit a écrit :

J'ai testé GlobalMemoryStatus qui fonctionne bien mais je ne sais pas trop comment interpréter ses résultats:
 
J'obtiens:
 
dwMemoryLoad      =           100   // percent of memory in use  
dwTotalPhys;      =    66 195 456   // bytes of physical memory  
dwAvailPhys;      =         8 192   // free physical memory bytes  
dwTotalPageFile;  = 2 081 284 096 // bytes of paging file  
dwAvailPageFile;  = 1 895 481 344 // free bytes of paging file  
dwTotalVirtual;   = 2 143 289 344 // user bytes of address space  
dwAvailVirtual;   = 1 972 109 312 // free user bytes  
 
Pourquoi 100% d'utilisation alors qu'il reste 8 Mo libre ?
 
J'ai bien 64 Mo de RAM (66 195 456 octets)




Je viens de réaliser ton erreur... L'unité ici est l'octet, pas le kilooctet! Ca veut dire qu'il reste (oui, oui) 8 kilooctets de libre !!!  
Ce qui devient cohérent avec les 100 % d'utilisation.

n°14015
z51
Posté le 13-02-2001 à 10:57:53  profilanswer
 

Ah oui en effet !! Bien vu !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  place mémoire dispo en C++

 

Sujets relatifs
[VBA] mise en place de filtre pour un réplica partiel 
Plus de sujets relatifs à : place mémoire dispo en C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR