Out of memory

Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
- - Dernière réponse : sebmafate
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 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à.
Afficher la suite 

6 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
0
Merci
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.
Commenter la réponse de Lutinore
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
10
0
Merci
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
Commenter la réponse de cs_GG29
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
30
0
Merci
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é. -
Commenter la réponse de krimog
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
10
0
Merci
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)
Commenter la réponse de cs_GG29
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
30
0
Merci
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é. -
Commenter la réponse de krimog
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
Comme l'explique Lutinore, je pense que tu as atteints la limite du Process.MaxWorkingSet.

Sébastien


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
Commenter la réponse de sebmafate