Probleme de Memoire

Probleme de Memoire - C++ - Programmation

Marsh Posté le 01-08-2006 à 08:59:44    

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.

Reply

Marsh Posté le 01-08-2006 à 08:59:44   

Reply

Marsh Posté le 01-08-2006 à 09:19:17    

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

Reply

Marsh Posté le 01-08-2006 à 13:30:53    

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

Reply

Marsh Posté le 01-08-2006 à 15:02:44    

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 :
Reply

Marsh Posté le 01-08-2006 à 15:07:21    

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

Reply

Marsh Posté le 01-08-2006 à 15:12:19    

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 :
Reply

Marsh Posté le 01-08-2006 à 15:14:08    

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 :
Reply

Marsh Posté le 01-08-2006 à 15:18:02    

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)

Reply

Marsh Posté le 01-08-2006 à 15:23:11    

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 :
Reply

Marsh Posté le 01-08-2006 à 15:43:50    

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
Reply

Marsh Posté le 01-08-2006 à 15:43:50   

Reply

Marsh Posté le 01-08-2006 à 16:04:30    

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

Reply

Marsh Posté le 01-08-2006 à 16:29:48    

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
Reply

Marsh Posté le 02-08-2006 à 00:58:27    

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
Reply

Marsh Posté le 02-08-2006 à 02:22:58    

skelter a écrit :

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


 
:jap:

Reply

Marsh Posté le 02-08-2006 à 10:53:12    

Reply

Marsh Posté le 02-08-2006 à 13:43:54    

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] .

Reply

Marsh Posté le 02-08-2006 à 18:01:17    


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

Reply

Marsh Posté le 02-08-2006 à 18:22:56    

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

Reply

Marsh Posté le 03-08-2006 à 00:10:13    

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
Reply

Marsh Posté le 03-08-2006 à 00:19:30    

Citation :

Sujet : Probleme de Memoire


mange du poisson !


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 03-08-2006 à 08:35:18    

nraynaud a écrit :

Citation :

Sujet : Probleme de Memoire


mange du poisson !


 
 [:tapai]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed