Je suis sur cette commande
Dictionary myIntDict = new Dictionary(89478458);
cette erreur:
System.OutOfMemoryException was unhandled HResult=-2147024882 Message=Array dimensions exceeded supported range. Source=mscorlib StackTrace: at System.Collections.Generic.Dictionary`2.Initialize(Int32 capacity) at System.Collections.Generic.Dictionary`2..ctor(Int32 capacity, IEqualityComparer`1 comparer)
Sur 89478457 il n’y a pas d’erreur. Voici la source de Initialize dans Dictionary.cs :
private void Initialize(int capacity) { int size = HashHelpers.GetPrime(capacity); ... ensortinges = new Entry[size]; ... }
Lorsque je reproduis cela, l’erreur se produit lors de la création du tableau. L’entrée est une structure dans ce cas de taille 24. Lorsque nous obtenons max int32 (0x80000000-1) et divisons le 24 = 89478485 et que ce nombre est compris entre les nombres premiers 89478457 et 89478503.
Cela signifie-t-il que ce tableau de struct ne peut pas être plus grand que maxInt32 / sizeOfThisStruct?
MODIFIER:
Oui. Je vais en fait plus de 2 Go. Cela se produit lorsque le dictionnaire crée le tableau interne de struct Entry où sont stockées les paires (clé, valeur). Dans mon cas, la taille de (entrée) est de 24 octets et comme type de valeur est alloué en ligne.
Et la solution consiste à utiliser l’indicateur gcAllowVeryLargeObjects (merci, Evk ). En fait, dans le kernel .net, l’indicateur est la variable d’environnement COMPlus_gcAllowVeryLargeObjects (merci svick ).
Et oui, Paparazzi a raison. Je dois penser à comment ne pas perdre de mémoire. Merci à tous.
Il existe une limitation connue du runtime .NET – la taille maximale autorisée de l’object sur le tas est de 2 Go, même pour la version 64 bits du runtime. Mais, à partir de .NET 4.5, il existe une option de configuration qui vous permet de relâcher cette limite (uniquement sur la version 64 bits du moteur d’exécution) et de créer des baies plus grandes. Exemple de configuration pour activer c’est:
A la surface, le dictionnaire n’a pas de sens
Vous ne pouvez avoir que des valeurs uniques int
Avez-vous vraiment que mes doublons
UnInt32 passe à 4 294 967 295
Pourquoi perdez-vous 4 octets?
89 478 458 lignes Une ligne est actuellement composée de 12 octets.
Vous avez 1 Go à environ 83 333 333 lignes
Puisqu’un object a besoin d’une mémoire contiguë, 1 Go est plus qu’une limite pratique
Si les valeurs sont vraiment une jambe de force 24
Puis 1 gb sur 31 250 000
C’est juste une très grande collection
Vous pouvez diviser est en plusieurs collections
Ou utilisez une classe car alors c’est juste une référence avec je pense est 4 octets