01net    Web


Actuellement en ligne : 337 Utilisateurs dont 11 dans Programmation et développement >S'inscrire      >S'identifier      >Recherche      >Aide  
modéré par A.Ouloube, Beno@  
01net > Forum de 01net > Programmation et développement > C/C++
> mon prog c++ n'utilise pas le swap
Auteur
Message
 
<     1       >
keket123
  
   
      ?   @     Posté le 16/08/2006 13:37:37  
Voter pour ce message
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=new double[20000];
}


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

[code]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 (oui, je sais, c'est beaucoup) ...
Quelqu'un a une idée??

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


sortie de "free -s 0.01":

[code] 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[/code]
blue_minou
  
   
      ?   @     Posté le 16/08/2006 14:21:26  
Voter pour ce message
keket123 a écrit :
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=new double[20000];
}


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

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


Salut,
D'après le message d'erreur, tu alloues mal.
Je ne sais pas ce qui cloche exactement, mais la ligne

double** Matrix=new double*[20000];


me paraît bizarre (mais peut-être est-elle correcte...).
Et puis, autant créer une classe Matrix non ?
icare_olivier
  arriere, band de newbies ^^
  :-)
      ?   @     Posté le 16/08/2006 16:26:08  
Voter pour ce message
A priori elle est correcte... c'est un tableau de 20000 pointeurs vers des doubles... Ceci dit, je vois mal l'interet :s
icare_olivier
  arriere, band de newbies ^^
  :-)
      ?   @     Posté le 16/08/2006 16:30:27  
Voter pour ce message
Hum, j'ai compris en lisant ton message :
double** Matrix=new double*[20000]; ca n'a rien à voir avec une matrice 20000*20000, c'est juste un tableau de 20000 pointeurs !
Pour faire une matrice :

double Matrix[20000][20000]; pour recup l'element x,y : Matrix[x][y];

ou

doublie Matrix[20000 * 20000]; (auquel cas il faudra acceder à l'élément x,y comme suit : Matrix[ x*20000 + y ] )
blue_minou
  
   
      ?   @     Posté le 16/08/2006 23:54:14  
Voter pour ce message
Ah voilà, c'était donc ça... je n'ai jamais écrit ce genre de choses.
keket123
  
   
      ?   @     Posté le 17/08/2006 01:07:22  
Voter pour ce message
Merci pour vos réponses... mais j'ai eu la solution par un autre forum: la mémoire adressable sur un sysème 32 bits, comme le mien, est limitée à 4GB, et linux n'en accorde que maximum 2GB par programme. Ici, ma "matrice" fait 3GB...

Oui, je sais que ce n'est pas vraiment une matrice, j'ai fait un abus de langage...

Je crois que je vais linéariser ma matrice comme me conseille icare_olivier et la stocker sous forme de fichier sur le disque...
keket123
  
   
      ?   @     Posté le 17/08/2006 01:11:50  
Voter pour ce message
Au fait, c'est pas juste pour le plaisir que je fais une matrice aussi monstrueuse, c'est parce que je dois inverser une matrice immense dans le cadre de mon mémoire.
Un truc de ouf...
blue_minou
  
   
      ?   @     Posté le 17/08/2006 02:19:04  
Voter pour ce message
keket123 a écrit :
Au fait, c'est pas juste pour le plaisir que je fais une matrice aussi monstrueuse, c'est parce que je dois inverser une matrice immense dans le cadre de mon mémoire.
Un truc de ouf...


Tu peux essayer de voir du côté du logiciel Octave aussi (http://www.gnu.org/software/octave/), clone libre de Matlab.
Minus-et-Cortex
  
   
      ?   @     Posté le 17/08/2006 08:54:41  
Voter pour ce message
Salut !

Il me semblait que par défaut, sur les 4GB adressables sur un système 32bits, sous Linux 3GB étaient réservés pour les programmes utilisateurs et 1GB pour le noyau, tandis que sous Windows, c'était 2GB pour les utilisateurs et autant pour le noyau. Après, il est possible de modifier ces paramètres pourr avoir du 2/2 sous Linux et du 3/1 sous Windows (mais je ne sais pas comment on fait... ahhh théorie, quand tu nous tiens !).
-------
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.
Gustave Parking
qizaki
  
   
      ?   @     Posté le 29/08/2006 12:26:34  
Voter pour ce message
Bonjour,
Utiliser la fonction suivante (#include<malloc.h> est nécessaire:

double **InitMatrix(int Ne,int Nf){
int a,s;
double **M;
//create matrix
M=(double **)malloc((Ne)*sizeof(double *));
for(s=0;s<Ne;s++){*(M+s)=(double*)malloc((Nf)*sizeof(double));}
//init
for(s=0;s<Ne;s++){
for(a=0;a<Nf;a++){*(*(M+s)+a)=0;}
}
return M;
}
après, dans main, vous faite:

double **Matrice;
Matrice=InitMatrix(20000,20000);

quant à double** Matrix=new double*[20000]; vous allouez 20000 pointeurs qui pointent vers NULL. ce n'est pas une matrice, il faut les alouer un par un. Ce p'tit programme GNU fait tout ça en offrant la possibilité de choisir les dim! c'est la base pour faire une classe de matrices.
qizaki
  
   
      ?   @     Posté le 29/08/2006 12:27:50  
Voter pour ce message
qizaki a écrit :
Bonjour,
Utiliser la fonction suivante (#include<malloc.h> est nécessaire):

double **InitMatrix(int Ne,int Nf){
int a,s;
double **M;
//create matrix
M=(double **)malloc((Ne)*sizeof(double *));
for(s=0;s<Ne;s++){*(M+s)=(double*)malloc((Nf)*sizeof(double));}
//init
for(s=0;s<Ne;s++){
for(a=0;a<Nf;a++){*(*(M+s)+a)=0;}
}
return M;
}
après, dans main, vous faite:

double **Matrice;
Matrice=InitMatrix(20000,20000);

quant à double** Matrix=new double*[20000]; vous allouez 20000 pointeurs qui pointent vers NULL. ce n'est pas une matrice, il faut les alouer un par un. Mpn p'tit programme fait tout ça en offrant la possibilité de choisir les dim! c'est la base pour faire une classe de matrices.
qizaki
  
   
      ?   @     Posté le 29/08/2006 12:48:10  
Voter pour ce message
J'ai oublié de signaler que après la création d'une matrice, pas la peine de travailler avec les notations de pointeur mais celles d'un tableau. Ainsi, au lieu de travailler avec *(*(Matrice+s)+a) on tape Matrice[a] tout simplement.
qizaki
  
   
      ?   @     Posté le 29/08/2006 12:49:02  
Voter pour ce message
qizaki a écrit :
J'ai oublié de signaler que après la création d'une matrice, pas la peine de travailler avec les notations de pointeur mais celles d'un tableau. Ainsi, au lieu de travailler avec *(*(Matrice+i)+j) on tape Matrice[j] tout simplement.
qizaki
  
   
      ?   @     Posté le 29/08/2006 12:50:30  
Voter pour ce message
qizaki a écrit :
qizaki a écrit :
J'ai oublié de signaler que après la création d'une matrice, pas la peine de travailler avec les notations de pointeur mais celles d'un tableau. Ainsi, au lieu de travailler avec *(*(Matrice+line)+colon) on tape Matrice[line][colon] tout simplement.

icare_olivier
  arriere, band de newbies ^^
  :-)
      ?   @     Posté le 01/09/2006 12:42:39  
Voter pour ce message
Evites de poster 50 fois d'affilé ^^ fais plutot "editer", ca fait plus...propre ;)
Ceci dit, je conseille à personne de travailler sur des pointeurs dans le code "principal" quand ca n'est pas nessesaire ... surtout quand on débute !!! Mieux vaut coder une classe matrix proprement en faisant attention aux problèmes éventuels de mémoire plutot que de se trimbaler des double ** de partout qui risquent de faire des problèmes... ca n'a QUE des avantages (surtout qu'on peut facilement implémenter des operateurs unaires (ou binaires) pour les matrices ou des operateurs entre matrices et vecteurs (cf des cours de maths ^^)
<     1       >

01net > Forum de 01net > Programmation et développement > C/C++
> mon prog c++ n'utilise pas le swap

Aller à :

Page générée en : 0.087s - X2board 2.2

Nous contacter | Charte de confiance | Voir notice légale

Tous droits réservés © 1999 - 2008 Groupe Tests - 01net.


Sites du réseau 01net Network : 01net - 01men - Rmc.fr - Bfmtv.fr - Radiobfm.com - TousLesPodcasts - Micro Achat

Automobile 
Découvrez l'essai vidéo de la Kia Sorento Shilton : un 4x4 aussi à l'aise sur route que sur piste.
Jeux
Mystery Case File : Recueillir des indices et résoudre des crimes vous passionne  ? Télécharger !