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

  FORUM HardWare.fr
  Programmation
  C++

  Probleme de Memoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de Memoire

n°1417173
stiko83
Posté le 01-08-2006 à 08:59:44  profilanswer
 

salut,
j'utilise une classe faite en C++ pour les calculs matriciels de grand taille la classe est le suivant:
c'est le début de la classe Matrix:

Code :
  1. //---------------------------------------------------------------------------
  2. template <class T>
  3. TMatrix<T>::TMatrix(int dimRow=10, int dimCol=1)
  4. {
  5. if (dimRow<1 || dimCol<1)
  6. throw TMatrixException(TMatrixException::DIM_TOO_SMALL);
  7. dimR=dimRow;
  8. dimC=dimCol;
  9. M=new T[dimR*dimC*sizeof(T)];
  10. P=new T*[dimR*sizeof(T*)];
  11. T *ref;
  12. ref=M;
  13. for (int i=0; i<dimR; i++)
  14. {
  15. P=ref;
  16. ref+=dimC;
  17. }
  18. clear();
  19. }
  20. //---------------------------------------------------------------------------
  21. template <class T>
  22. TMatrix<T>::TMatrix(int dim)
  23. {
  24. if (dim<1)
  25. throw TMatrixException(TMatrixException::DIM_TOO_SMALL);
  26. dimR=dim;
  27. dimC=dim;
  28. M=new T[dimR*dimC*sizeof(T)];
  29. P=new T*[dimR*sizeof(T*)];
  30. T *ref;
  31. ref=M;
  32. for (int i=0; i<dimR; i++)
  33. {
  34. P=ref;
  35. ref+=dimC;
  36. }
  37. clear();
  38. }
  39. //---------------------------------------------------------------------------
  40. template <class T>
  41. TMatrix<T>::TMatrix(const TMatrix<T>& m)
  42. {
  43. dimR=m.dimR;
  44. dimC=m.dimC;
  45. M=m.M;
  46. P=m.P;
  47. }
  48. //---------------------------------------------------------------------------
  49. template <class T>
  50. TMatrix<T>::~TMatrix()
  51. {
  52. /*delete[] M;
  53. delete[] P;*/
  54. }
  55. //---------------------------------------------------------------------------
  56. template <class T>
  57. void TMatrix<T>::destroy()
  58. {
  59. delete[] M;
  60. delete[] P;
  61. }
  62. //---------------------------------------------------------------------------
  63. template <class T>
  64. void TMatrix<T>::clear()
  65. {
  66. for (int i=0; i<dimR; i++)
  67. for (int j=0; j<dimC; j++)
  68. P[j]=0;
  69. }


quand je l utilise pour faire des calculs sur des matrice de grndes tailles il devient trés gormand en mémoire et tres lent. est ce vous avez des idées comment pour mieux gerer le mémoire.
comme pour e destructeur il me donne toujours des exeptions pourcela j ai fait une fonction destroy() pour la désallocation de mémoire.

mood
Publicité
Posté le 01-08-2006 à 08:59:44  profilanswer
 

n°1417193
LetoII
Le dormeur doit se réveiller
Posté le 01-08-2006 à 09:19:17  profilanswer
 

Juste une idée comme ça, le tableau de pointeur sur le début des lignes est vraiment nécessaire?

n°1417395
skelter
Posté le 01-08-2006 à 13:30:53  profilanswer
 

le destructeur est vide et ce n'est meme pas safe-assignable, meme conseil que dans ton autre topic, n'utilise pas ce code !
 

n°1417483
icareo
Posté le 01-08-2006 à 15:02:44  profilanswer
 

Dans la ligne
 
M=new T[dimR*dimC*sizeof(T)];
 
quelqu'un m'explique à quoi sert le sizeof ? :s
 
on aurrait M= (T*) malloc( dimR*dimC*sizeof(T) );
 
je comprendrais. mais il n'y a pas un peu sizeof(T) fois trop de mémoire utilisée?


---------------
tutos de programmation 3D :
n°1417489
skelter
Posté le 01-08-2006 à 15:07:21  profilanswer
 

c'est une des trop nombreuses erreurs que compte ce code

n°1417496
icareo
Posté le 01-08-2006 à 15:12:19  profilanswer
 

mh ... surement, mais aparement, si ya un problème de mémoire (à priori c'est le problème qu'il pose... il tient peut être à coder absolument avec ce code !), ca doit etre de la qu'il vient ! à plus forte raison si tu utilises le template avec une classe volumineuse ^^ (déja avec un int ca en prend 4 fois trop...Alors avec une classe bien pleine...)


Message édité par icareo le 01-08-2006 à 15:12:51

---------------
tutos de programmation 3D :
n°1417497
icareo
Posté le 01-08-2006 à 15:14:08  profilanswer
 

Question à part, je me suis tjrs servi de sizeof() sans m'en soucier, mais... ca retourne la taille en nombre d'octets ? ou de bits ?


---------------
tutos de programmation 3D :
n°1417502
skelter
Posté le 01-08-2006 à 15:18:02  profilanswer
 

icareo a écrit :

Question à part, je me suis tjrs servi de sizeof() sans m'en soucier, mais... ca retourne la taille en nombre d'octets ? ou de bits ?


 
ca retourne la taille en char, et le plus souvent 1 char = 1 octet
 

Citation :

mh ... surement, mais aparement, si ya un problème de mémoire (à priori c'est le problème qu'il pose... il tient peut être à coder absolument avec ce code !)


 
il peut y avoir d'autre probleme, trop de bug sont à prevoir, regardes bien le code il y en a partout (genre la methode clear qui assigne 0 qu'a la premiere ligne ou la copie qui peut tout faire planter en plus d'engendrer une fuite)

n°1417504
icareo
Posté le 01-08-2006 à 15:23:11  profilanswer
 

lol...autre pb aussi ^^ l'operateur de copie... c'est moi ou le affecte à la copie le meme pointeur qu'à l'original :D
 
mh..Bref. à la reflexion, je suis d'accord avec skelter, utilises un des nombreux codes tout faits... ou révises tout ton code :s


---------------
tutos de programmation 3D :
n°1417523
stiko83
Posté le 01-08-2006 à 15:43:50  profilanswer
 

j ai oublié de vous dire que j ai enlevé le sizeof() et ca ameliore un peu le temps d execution.
 
j ai fait beaucoup de calcul en utilisant ce code. il y a pas une méthode pour améliorer la perfermance de ce code au lieu d'utiliser un autre code?
en diminuant la memoire utilisée et en diminuant  le temps d éxecution?
 
est ce q il ya de probleme avec ce code qui rempli une matrice par une colonne de nombre f de la matrice m??
 

Code :
  1. template <class T>
  2. TMatrix<T> TMatrix<T>::fill( const TMatrix<T>& m , int f)
  3. if (m.dimC>1)
  4.         throw TMatrixException(TMatrixException::NOT_UNI_COLUMN);
  5. TMatrix<T> r(dimR,dimC);
  6.     for (int i=0; i<dimR; i++)
  7.                  P[i][f]=m.P[i][0];
  8.    
  9.          
  10.   return *this;
  11. }


merci


Message édité par stiko83 le 01-08-2006 à 15:52:58
mood
Publicité
Posté le 01-08-2006 à 15:43:50  profilanswer
 

n°1417548
skelter
Posté le 01-08-2006 à 16:04:30  profilanswer
 

:??:  
 
pourquoi tu ne veux pas utiliser une vria lib faite pour ca ? c'est quand meme la meilleur des solutions ??

n°1417588
stiko83
Posté le 01-08-2006 à 16:29:48  profilanswer
 

je suis d accord que c est mieux d'utiliser une lib faite pour ce genre de calcul mais ca fait 4 semaines que je travaille sur ce code et il me donne les rédultats que j attend mais comme je vous ai dit le probleme de memoire et le temps d éxecution qui me gene.


Message édité par stiko83 le 01-08-2006 à 16:31:51
n°1417840
el muchach​o
Comfortably Numb
Posté le 02-08-2006 à 00:58:27  profilanswer
 

Et vu comment tu maîtrises le langage, tu vas en  passer 8 autres à débuguer ton code sans jamais avoir la moindre chance d'arriver au niveau de performance de codes écrits par des mathématiciens professionnels et optimisés pendant des années.
 
Regarde plutôt ça: http://www.boost.org/libs/numeric/ublas/doc/index.htm
conseils d'utilisation:
http://www.crystalclearsoftware.co [...] tive_UBLAS
ou ça: http://lapackpp.sourceforge.net/


Message édité par el muchacho le 02-08-2006 à 01:22:28

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1417872
oseam
Yume wa kitto kanau
Posté le 02-08-2006 à 02:22:58  profilanswer
 

skelter a écrit :

ca retourne la taille en char, et le plus souvent 1 char = 1 octet


 
:jap:

n°1417992
skelter
Posté le 02-08-2006 à 10:53:12  profilanswer
 
n°1418097
SBAM
Best recording of rach 3.
Posté le 02-08-2006 à 13:43:54  profilanswer
 

Bon, pour repondre a la question initiale  :o :
Il n'y y a pas de solutions a ton probleme de memoire. Si tu ne manipules pas des matrices creuses, tu es condamne a te trimballer ces structures. Ou alors, tu peux faire des analyses en composantes principales pour diminuer la dimension, mais c'est une compression destructive.
En revanche, pour les operations sur ces matrices, tu peux facilement derouler les boucles, mais comme on te l'as conseille a de multiples reprises plus haut : utilises une vraie bibliotheque, genre Blitz  [:huit] .

n°1418456
oseam
Yume wa kitto kanau
Posté le 02-08-2006 à 18:01:17  profilanswer
 


Ton lien parle de bits, pas d'octets..
 
1 char = 1 octet, quelque soit la taille en bits de cet octet.

n°1418467
skelter
Posté le 02-08-2006 à 18:22:56  profilanswer
 

oseam a écrit :

Ton lien parle de bits, pas d'octets..
 
1 char = 1 octet, quelque soit la taille en bits de cet octet.


 
1 octet = 8 bits comme son nom l'indique, en francais on dit plutot 1 char = 1 multiplet ou 1 codet

n°1418669
el muchach​o
Comfortably Numb
Posté le 03-08-2006 à 00:10:13  profilanswer
 

SBAM a écrit :

Bon, pour repondre a la question initiale  :o :
Il n'y y a pas de solutions a ton probleme de memoire. Si tu ne manipules pas des matrices creuses, tu es condamne a te trimballer ces structures. Ou alors, tu peux faire des analyses en composantes principales pour diminuer la dimension, mais c'est une compression destructive.
En revanche, pour les operations sur ces matrices, tu peux facilement derouler les boucles, mais comme on te l'as conseille a de multiples reprises plus haut : utilises une vraie bibliotheque, genre Blitz  [:huit] .


Je la cherchais aussi celle-là. Blitz++


Message édité par el muchacho le 03-08-2006 à 00:10:49

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1418671
nraynaud
lol
Posté le 03-08-2006 à 00:19:30  profilanswer
 

Citation :

Sujet : Probleme de Memoire


mange du poisson !


---------------
trainoo.com, c'est fini
n°1418708
LetoII
Le dormeur doit se réveiller
Posté le 03-08-2006 à 08:35:18  profilanswer
 

nraynaud a écrit :

Citation :

Sujet : Probleme de Memoire


mange du poisson !


 
 [:tapai]

mood
Publicité
Posté le   profilanswer
 


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

  Probleme de Memoire

 

Sujets relatifs
manipulation de std::vector problème de mémoireGROS PROBLEME sous VBA word...Memoire insuffisante?
probleme de memoire de la VM javaProbleme conso mémoire string (libstdc++)
Problème de mémoire entre hébergementProblème complexe : flush de la memoire tampon d'un JFileChooser
Problème de mémoire...Probleme de mapping memoire[résolu]
probleme allocation memoire 
Plus de sujets relatifs à : Probleme de Memoire


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