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

  FORUM HardWare.fr
  Programmation
  C

  [debutant] Probleme d'allocation memoire pour de grands tableaux

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[debutant] Probleme d'allocation memoire pour de grands tableaux

n°817771
Stoffinato​r
Posté le 09-08-2004 à 08:13:08  profilanswer
 

Salut,
 
Mon probleme est le suivant: je dois pouvoir manipuler des tableaux de plusieurs dimensions (5 au max) contenant un grand nombre de reels longs (plusieurs dizaines de millions :pt1cable: ).
Pour cela, et en m'inspirant allegrement de numerical species, j'ai ecrit une routine me permettant d'allouer de la memoire et d'initialiser les tableaux.
Quand je teste le code avec des tableaux simples, tout marche impec, que ce soit au moment de l'allocation memoire ou des manipulations ulterieures.
Par contre, quand je dois allouer de la memoire pour disons 7 tableaux de 35 millions de reels chacun, j'ai le message d'erreur "allocation failure..." (voir code cidessous)
 
Questions: Combien de place prend un reel long?
           Est-ce lie a la memoire vive ou a une limitation de compilateur?
 
Y a t'il des solutions envisageables?
merci :hello:  
 
 
Le code d'allocation est poste ci dessous:

Code :
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stddef.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #define NR_END 1
  7. #define FREE_ARG char*
  8. double *****f5tensor(long n1l,long n1h,long n2l,long n2h,long n3l,long n3h,long n4l,long n4h,long n5l,long n5h)
  9. //allocate a double 5Dtensor with range t[n1l,n1h][n2l,n2h][n3l,n3h][n4l,n4h][n5l,n5h]
  10. {
  11. long i,j,k,l,n1=n1h-n1l+1,n2=n2h-n2l+1,n3=n3h-n3l+1,n4=n4h-n4l+1,n5=n5h-n5l+1;
  12. double *****t;
  13. //allocate pointers to pointers to pointers to pointers (!!) to rows
  14. t=(double *****)malloc((size_t)((n1+NR_END)*sizeof(double ****)));
  15. if(!t) rterror("allocation failure 1 in f5tensor()","f5tensor.txt" );
  16. t +=NR_END;
  17. t -=n1l;
  18. //allocate pointers to pointers to pointers to rows
  19. t[n1l]=(double ****)malloc((size_t)((n1*n2+NR_END)*sizeof(double ***)));
  20. if(!t[n1l]) rterror("allocation failure 2 in f5tensor()","f5tensor.txt" );
  21. t[n1l] +=NR_END;
  22. t[n1l] -=n2l;
  23. //allocate pointers to pointers to rows
  24. t[n1l][n2l]=(double ***) malloc((size_t)((n1*n2*n3+NR_END)*sizeof(double **)));
  25. if (!t[n1l][n2l]) rterror("allocation failure 3 in f5tensor()","f5tensor.txt" );
  26. t[n1l][n2l] += NR_END;
  27. t[n1l][n2l] -= n3l;
  28. /* allocate pointers to rows and set pointers to them */
  29. t[n1l][n2l][n3l]=(double **) malloc((size_t)((n1*n2*n3*n4+NR_END)*sizeof(double*)));
  30. if (!t[n1l][n2l][n3l]) rterror("allocation failure 4 in f5tensor()","f5tensor.txt" );
  31. t[n1l][n2l][n3l] += NR_END;
  32. t[n1l][n2l][n3l] -= n4l;
  33. /* allocate rows and set pointers to them */
  34. t[n1l][n2l][n3l][n4l]=(double *) malloc((size_t)((n1*n2*n3*n4*n5+NR_END)*sizeof(double)));
  35. if (!t[n1l][n2l][n3l][n4l]) rterror("allocation failure 5 in f5tensor()","f5tensor.txt" );
  36. t[n1l][n2l][n3l][n4l] += NR_END;
  37. t[n1l][n2l][n3l][n4l] -= n5l;

mood
Publicité
Posté le 09-08-2004 à 08:13:08  profilanswer
 

n°817775
Taz
bisounours-codeur
Posté le 09-08-2004 à 08:34:23  profilanswer
 

bon allez, on va dire que tu es sous x86
 
sizeof(long) == sizeof(pointer) == 4 (octets)
sizeof(double) == 8 (octets)
 
donc déjà, tu peux voir que tes poineurs occupent un place non négligeable.
 
cela dit 35millions, c'est pas étonnant, t'es complètement tarré.
1) utilise des float
2) utilise des matrices creuses (ou exploite tout autre propriété de ton espace 5d)
3) je comprends pas ton allocation, y a pas une seule boucle, ça me parait pas correct. à chaque fois, tu n'alloue s que 1 élément parmi n. commence par savoir correctement allouer une matrice 2D (et sans ces NR_END monstrueux)

n°817777
cricri_
Posté le 09-08-2004 à 08:40:36  profilanswer
 

Pour moi c'est lié à la mémoire vive, et puis je ne sais pas si tu te rends compte de ce que ça fait 7*35 millions de réels, mais c'est clair que ça doit exploser la mémoire vive ça fait déjà 245 millions, et un réel ne fait pas un seul octet, c'est 4 et 8 pour le double, donc là ça fait pas loin de 2 Go de mémoire je pense ...

n°817779
Stoffinato​r
Posté le 09-08-2004 à 08:48:34  profilanswer
 

J'ai oublie de preciser que j'ai pas poste le code en entier desole
Enfin bon ca marche avec des petits tableaux.
Une matrice creuse c'est quoi?
Je vais passer tout ca en float
merci :jap:  
 
 
La suite du code pour information:
 

Code :
  1. for(l=n4l+1;l<=n4h;l++) t[n1l][n2l][n3l][l]=t[n1l][n2l][n3l][l-1]+n5;
  2. for(k=n3l+1;k<=n3h;k++){
  3.  t[n1l][n2l][k]=t[n1l][n2l][k-1]+n4;
  4.  t[n1l][n2l][k][n4l]=t[n1l][n2l][k-1][n4l]+n4*n5;
  5.  for(l=n4l+1;l<=n4h;l++) t[n1l][n2l][k][l]= t[n1l][n2l][k][l-1]+n5;
  6. }
  7. for(j=n2l+1;j<=n2h;j++){
  8.  t[n1l][j]=t[n1l][j-1]+n3;
  9.  t[n1l][j][n3l]=t[n1l][j-1][n3l]+n3*n4;
  10.  t[n1l][j][n3l][n4l]=t[n1l][j-1][n3l][n4l]+n3*n4*n5;
  11.  for(k=n3l+1;k<=n3h;k++){
  12.   t[n1l][j][k]= t[n1l][j][k-1]+n4;
  13.   t[n1l][j][k][n4l]=t[n1l][j][k-1][n4l]+n4*n5;
  14.   for(l=n4l+1;l<=n4h;l++){
  15.    t[n1l][j][k][l]=t[n1l][j][k][l-1]+n5;
  16.   }
  17.  for(l=n4l+1;l<=n4h;l++) t[n1l][j][n3l][l]=t[n1l][j][n3l][l-1]+n5;
  18.  }
  19. }
  20. for(i=n1l+1;i<=n1h;i++){
  21.  t[i]=t[i-1]+n2;
  22.  t[i][n2l]=t[i-1][n2l]+n2*n3;
  23.  t[i][n2l][n3l]=t[i-1][n2l][n3l]+n2*n3*n4;
  24.  t[i][n2l][n3l][n4l]=t[i-1][n2l][n3l][n4l]+n2*n3*n4*n5;
  25.  for(j=n2l+1;j<=n2h;j++){
  26.   t[i][j]=t[i][j-1]+n3;
  27.   t[i][j][n3l]=t[i][j-1][n3l]+n3*n4;
  28.   t[i][j][n3l][n4l]=t[i][j-1][n3l][n4l]+n3*n4*n5;
  29.   for(k=n3l+1;k<=n3h;k++){
  30.    t[i][j][k]=t[i][j][k-1]+n4;
  31.    t[i][j][k][n4l]=t[i][j][k-1][n4l]+n4*n5;
  32.    for(l=n4l+1;l<=n4h;l++) t[i][j][k][l]=t[i][j][k][l-1]+n5;
  33.   for(l=n4l+1;l<=n4h;l++) t[i][j][n3l][l]=t[i][j][n3l][l-1]+n5;
  34.   }
  35.  }
  36.  for(k=n3l+1;k<=n3h;k++){
  37.      t[i][n2l][k]=t[i][n2l][k-1]+n4;
  38.      t[i][n2l][k][n4l]=t[i][n2l][k-1][n4l]+n4*n5;
  39.   for(l=n4l+1;l<=n4h;l++) t[i][n2l][k][l]=t[i][n2l][k][l-1]+n5;
  40.  }
  41.  for(l=n4l+1;l<=n4h;l++) t[i][n2l][n3l][l]=t[i][n2l][n3l][l-1]+n5;
  42. }
  43. return t;

n°817805
Taz
bisounours-codeur
Posté le 09-08-2004 à 09:44:29  profilanswer
 

ben ça n'on plus c'est pas bon, tu vas segfaulter à coup sur. ton allocation est mauvaise.

n°819733
el muchach​o
Comfortably Numb
Posté le 10-08-2004 à 23:16:30  profilanswer
 

Stoffinator a écrit :

J'ai oublie de preciser que j'ai pas poste le code en entier desole
Enfin bon ca marche avec des petits tableaux.
Une matrice creuse c'est quoi?
Je vais passer tout ca en float
merci :jap:  


 
Je te préviens tout de suite, tu vas au-devant de grosses difficultés.
Une matrice creuse est une matrice dont la majorité des éléments sont nuls. Ce que te suggère Taz, c'est d'employer des méthodes de stockage qui consistent à n'allouer que l'espace nécessaire aux éléments non nuls. Autrement dit, c'est pas simple, mais vu ton problème, tu n'as pas le choix. Les algorithmes seront forcément compliqués par cette contrainte d'espace. De toute façon, il n'est absolument pas question de faire le moindre calcul en RAM sur des centaines de millions de float dont 95 à 99% sont vraisemblablement nuls.
Donc ce n'est pas la peine de continuer ainsi, les algos de Numerical Recipes ne t'aideront pas. Il te faut commencer par te documenter un maximum sur les méthodes numériques avancées en algèbre et les librairies existantes (BLAS, LAPACK, etc), parce que ce genre d'algos, c'est plutôt l'affaire de spécialistes. Chap. 2.7 "Sparse linear systems" dans Numerical Recipes.


Message édité par el muchacho le 10-08-2004 à 23:19:49
n°821115
Stoffinato​r
Posté le 12-08-2004 à 09:54:36  profilanswer
 

Merci de ta reponse.
La j'ai tout passe en float et ca passe.  
Dans les tableaux que j'utilise, c'est plutot 99% des resultats qui sont pas nuls, et du plus, je ne fais aucune operation algebrique dessus.
En fait, je dois transferer les donnes calculees a l'aide d'un programme vers un autre logiciel qui doit utiliser ces donnees.
POur les transferer, je les ecris dans des fichiers qui contient donc les millions de nombres.
Ensuite le logociel reprend ces donnees pour s'en servir dans ces calculs.
voila koi.
 


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

  [debutant] Probleme d'allocation memoire pour de grands tableaux

 

Sujets relatifs
débutant en PHP a besoin d'aide !!Problème avec un formulaire ! ! ! !problème envoi formulaire sur mail?
[Access / Word / VB] Problème de module et publipostageProbleme div xHTML/CSS Firefox IE6
probleme de modélisation meriseprobleme de concaténation requete mysql
[DEVC++] Problème de linkage?? 
Plus de sujets relatifs à : [debutant] Probleme d'allocation memoire pour de grands tableaux


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