Probleme d'allocation memoire pour de grands tableaux [debutant] - C - Programmation
Marsh Posté le 09-08-2004 à 08:34:23
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)
Marsh Posté le 09-08-2004 à 08:40:36
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 ...
Marsh Posté le 09-08-2004 à 08:48:34
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
La suite du code pour information:
Code :
|
Marsh Posté le 09-08-2004 à 09:44:29
ben ça n'on plus c'est pas bon, tu vas segfaulter à coup sur. ton allocation est mauvaise.
Marsh Posté le 10-08-2004 à 23:16:30
Stoffinator a écrit : J'ai oublie de preciser que j'ai pas poste le code en entier desole |
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.
Marsh Posté le 12-08-2004 à 09:54:36
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.
Marsh Posté le 09-08-2004 à 08:13:08
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 ).
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
Le code d'allocation est poste ci dessous: