Bonjour à tous,
J'ai un programme qui stocke pas mal de données en RAM
Je tombe sur cette erreur :
System.OutOfMemoryException: Les dimensions du tableau dépassent la plage prise en charge.
à System.Collections.Generic.List`1.set_Capacity(Int32 value)
à System.Collections.Generic.List`1.EnsureCapacity(Int32 min)
à System.Collections.Generic.List`1.Add(T item)
Je stocke mes données dans
- deux List(Of Single)
- une List(Of Color)
C'est un programme qui fait de la 3D.
J'arrive à gérer 22 millions de triangles, pour chaque triangle on stoke :
- trois nombres Single pour le vecteur normal
- neuf nombre Single pour les coordonnées (X,Y,Z) des trois sommets
- une couleur (entier 32 bits)
Cela fait 1,06 Go de données utiles (un single étant stocké sur 4 octets), auxquelles il faut ajouter les octets requis par les pointeurs utilisés par les listes
Au delà (25 millions de triangles) ça plante.
Alors oui 22 millions de triangles c'est déjà pas mal
Avec ces données, le programme compilé en release 64 bits, sous Seven 64 bits intégrale, consomme 1,9 à 2,6Go de RAM.
(NB : en plus les triangles sont envoyés dans la carte graphique via Open GL pour affichage, tout en restant en RAM pour les calculs de mon programme)
Je n'ai pas à rougir, VisCamView n'arrive pas à ouvrir ce fichier STL de 22 millions de triangles, et MeshLab y arrive mais en chie
Mon PC a 16 Go de RAM, lorsque le plantage se produit il n'y a même pas la moitié de ces 16 Go qui est utilisée... C'est frustrant...
Je programme aussi en embarqué (microcontrôleur), je suis habitué à pouvoir exploiter le hardware à 100%j'aimerais bien exploiter mon PC à fond
Est-il possible d'aller au dela ?
Il me semble que l'intérêt du 64 bits par rapport au 32 bits est justement la possibilité d'outrepasser la limite de 4Go de RAM
Et vis à vis de la fragmentions de la mémoire, il me semble que c'était aussi l'intérêt des listes par rapport au tableaux
A bientôt
Partager