place mémoire dispo en C++ - Programmation
Marsh Posté le 08-02-2001 à 16:54:28
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
Marsh Posté le 08-02-2001 à 18:15:34
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.
Marsh Posté le 08-02-2001 à 20:36:35
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.
Marsh Posté le 08-02-2001 à 21:35:38
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...
Marsh Posté le 08-02-2001 à 22:27:39
eh bien ... GlobalMemoryStatus te donne ces infos justement :
mémoire physique totale = quantité de ram totale
mémoire physique dispo = quantité de ram libre
Marsh Posté le 09-02-2001 à 01:19:11
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--
Marsh Posté le 09-02-2001 à 09:35:05
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...
Marsh Posté le 09-02-2001 à 16:11:59
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 ?
Marsh Posté le 09-02-2001 à 20:36:58
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 ...)
Marsh Posté le 10-02-2001 à 11:18:19
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--
Marsh Posté le 11-02-2001 à 16:44:32
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
Marsh Posté le 12-02-2001 à 23:42:51
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.
Marsh Posté le 12-02-2001 à 23:45:45
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.
Marsh Posté le 08-02-2001 à 14:30:18
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 !