cs_GG29
Messages postés326Date d'inscriptionvendredi 23 décembre 2005StatutMembreDernière intervention 8 février 2011
-
7 janv. 2010 à 22:27
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 2014
-
15 janv. 2010 à 10:19
Bonjour,
J'ai créé une liste chainée.
Lorsque j'exécute ceci j'ai une erreur de type OutOfMemoryException
var l = new LinkedList<long>();
for (var i = 0L; i < long.MaxValue; i++)
{
l.AddFirst(i);
}
Au moment où ca plante la mémoire utilisée est d'environ 1.2GO.
Je suis sur Windows 7 64bits et j'ai 6GO de RAM donc théoriquement ca ne vient pas de là.
A voir également:
Exception of type 'system.outofmemoryexception' was thrown.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 8 janv. 2010 à 00:16
Salut,
Int64.MaxValue c'est juste énorme comme valeur quand même.. La propriété Count de la liste chainée est un Int32 doit y avoir un dépassement de capacité à un moment. La taille de la mémoire "privé" dédiée à un processus est différente de la mémoire total du system, pour un processus 32 Bits c'est 2GB pour un 64 bits je ne sais pas regarde du coté de la proprété Process.MaxWorkingSet.
cs_GG29
Messages postés326Date d'inscriptionvendredi 23 décembre 2005StatutMembreDernière intervention 8 février 201117 8 janv. 2010 à 09:53
Pour info j'utilise une liste simplement chainé que j'ai créer moi même donc je n'ai pas de problème de count en Int32.
http://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx User-mode virtual address space for each 64-bit process
With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):
x64: 8 TB
Intel IPF: 7 TB
2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared
J'ai regardé du coté de Process.MaxWorkingSet : 1,4GO et ce que je compile en x86 ou x64
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 8 janv. 2010 à 11:09
Salut
long = Int64
Ton code crée une liste chainée de long avec long.MaxValue entrées.
Une liste simplement chainée utilise (dans la mémoire) 2 pointeurs et 1 valeur (1 pointeur vers le maillon suivant, et un pointeur vers la valeur).
Tu es sur un 64 bits : un pointeur fait 64 bits. Tes données sont des long, et font donc 64 bits.
Résumé : chaque entrée fait 192 bits = 24 octets. (+ peut-être d'autres informations enregistrées par le framework)
Tu veux en faire long.MaxLength.
ça nous fait donc 2^64 2^32^2 (4 milliard et quelques)^2 = (taille maximum en octets de la mémoire gérée par un système 32 bits)^2 = taille maximum en octets de la mémoire gérée par un système 64 bits.
(que tu multiplies bien sûr par la taille de ton objet)
En fait, il te faudrait exactement 384 Eo (Exaoctets) de mémoire rien que pour enregistrer ta liste chainée. (Les puristes diront 384 Eio (Exbioctets))
Cela représente 384 milliards de Go = 384 milliards de milliards d'octets !! Donc avec tes 6 Go de RAM, t'en es loin ^^
Pour info, il te faudrait déjà 20 Go de RAM pour faire la même chose en remplaçant les long par des int.
Krimog : while (!(succeed = try())) ; - Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
cs_GG29
Messages postés326Date d'inscriptionvendredi 23 décembre 2005StatutMembreDernière intervention 8 février 201117 8 janv. 2010 à 11:24
En effet je n'avait pas penser à la taille que ca prendrait en mémoire (mais c'était juste pour essayer ^^). Cependant je ne comprends toujours pas pourquoi j'ai une erreur de type out of memory vers 1,2 GO d'espace memoire occupé. Car même si mon programme s'exécutait en 32bits il devrait s'arreter vers 2GO (moins la taille des dll du framework chargés ce qui ne doit pas faire 800MO à mon avis)
Vous n’avez pas trouvé la réponse que vous recherchez ?
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 8 janv. 2010 à 11:29
Je ne sais pas comment fonctionne l'allocation mémoire de .net assez précisément. Il s'est peut-être rendu compte qu'il y en aurait trop avant d'atteindre la limite. Il a peut-être une limite de mémoire par programme...
Krimog : while (!(succeed = try())) ; - Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -