1

Salut!
Je débute en c++ et j'ai le problème suivant:
je veux exécuter un prog qui crée une matrice de "double" de dimension 20000 x 20000:

#include <iostream>
using namespace std;

int main(){
cout<<"size of double: "<< sizeof(double)<<endl;
double** Matrix=new double*[20000];
for (int i=0; i<20000; i++) Matrix[i]=new double[20000];
}



Quand je lance le prog, j'obtiens la sortie suivante:

size of double: 8
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc
Aborting


Si je tape la commande linux "free -s 0.01" pendant l'exécution du prog, je remarque que la mémoire physique diminue pratiquement jusque zéro puis que le prog s'arrête. Je ne comprends pas pourquoi il ne continue pas à tourner en utilisant les 18 GB de mon swap...
Quelqu'un a une idée??

(je suis sous debian et je compile avec g++)


sortie de "free -s 0.01":

total used free shared buffers cached
Mem: 516692 437852 78840 0 40244 190016
-/+ buffers/cache: 207592 309100
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 445044 71648 0 40244 190016
-/+ buffers/cache: 214784 301908
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 455088 61604 0 40244 190016
-/+ buffers/cache: 224828 291864
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 467364 49328 0 40244 190016
-/+ buffers/cache: 237104 279588
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 476788 39904 0 40244 190016
-/+ buffers/cache: 246528 270164
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 489064 27628 0 40244 190016
-/+ buffers/cache: 258804 257888
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 499604 17088 0 40244 190016
-/+ buffers/cache: 269344 247348
Swap: 17757076 112 17756964

total used free shared buffers cached
Mem: 516692 510564 6128 0 40240 188996
-/+ buffers/cache: 281328 235364
Swap: 17757076 112 17756964

2

Matrix[i] = new double [2oooo];

3

je sais pas pourquoi ça marche pas, mais tu n'as qu'a créer un fichier ça revient à peu près la même chose.

4

note aussi que si tu es sur un OS 32 bits, même si tu utilises le swap tu vas vite taper dans la limite des 4 Go d'adressage ^^ (donc par exemple tu ne pourras pas passer la taille de ta matrice de 20000 à 25000 même si tu as assez de swap : je ne sais pas si c'est gênant pour toi, je signale juste au cas où)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

5

Juste une remarque rapide sans me pencher plus sur la question.
Ton programme ne remplis pas la mémoire (pas même la mémoire physique).
Sur ta dernière capture il te reste encore 230Mo de libres.

6

./4> oui, c'est même beaucoup moins en fait, vu que le noyau est mappé dans l'espace d'adressage des processus. Il me semble qu'il se réserve les 2Go supérieurs.

7

cross, ./5>
si c'est le cas alors c'est peut-être tout simplement que linux n'aime pas que tu alloues quasiment 3 Go de mémoire (c'est tout à fait possible, puisqu'il a besoin de se réserver de la place pour lui, pour les libs partagées et tout ça : mais peut-être qu'avec une recompilation du noyau on peut minimiser l'espace réservé à linux lui-même ?)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

./6> ben si le noyau se réserve 2 Go c'est parfaitement normal que ça foire ^^ (sous windows c'est juste 1 Go, nanananère cheeky)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

9

En fait je viens de voir, c'est 1Go supérieur. T'as des options pour passer à 2Go (nécessaire pour certains drivers foireux qui mappent des données dans l'espace noyau).
Sinon, tu peux activer l'extension HIGHMEM pour qu'il ne "mappe plus rien" (en fait il le fait mais les mappings sont temporaires). L'inconvénient c'est que les entrées-sorties doivent passer par un bounce buffer.

http://kerneltrap.org/node/2450

[edit: de toutes façons, si tu as *besoin* d'autant de mémoire, c'est qu'il faut que tu repenses complètement ton approche du problème]

10

En fait, il y a *peut-être* une solution qu'on n'a pas mentionnée sur dvp.com, c'est de passer à une architecture 64bits. Là, il est possible qu'un process puisse directement avoir plus de 2Go de mem...
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

11

C'est pas une solution ça, c'est un aveu d'échec tongue

12

Bah une solution est aussi de changer la structure de donnee...
Genre si sa matrice est creuse ou presque-creuse, s'il y a des patterns etc.