OutOfMemoryException lors de l'ajout d'autres éléments à un très grand HashSet & Int; Int32 & gt;
Exception de type System.OutOfMemoryException
a été jeté, tout en essayant d'ajouter 23997908th
élément dans un HashSet<Int32>
.
Nous avons besoin de maintenir un haut niveau de performance unique de collecte de l'entier sizeof Int32
.MaxValue c'est à dire 2147483647
. HashSet
de Int32
ne peuvent stocker que des 23997907
des éléments. La recherche d'une suggestion pour résoudre ce problème.
source d'informationauteur Debasis
Vous devez vous connecter pour publier un commentaire.
capacité d'un HashSet(T) de l'objet est le nombre d'éléments que l'objet peut contenir. l'objet de la capacité augmente automatiquement lorsque des éléments sont ajoutés.
Vous pouvez activer les paramètres de fichier de configuration,
Cochez cette MSDN lien pour le réglage de la configuration.
Mise à jour:
HashSet
pousse en doublant. Ainsi, lorsque vous avez 23,997,907 éléments dans la liste et essayez d'ajouter le suivant, il tente de doubler la taille de son support de tableau. Et que la répartition des causes il à dépasser la mémoire disponible. Je suppose que vous êtes l'exécution de ce sur un système 32 bits sur un système 64 bits unHashSet<object>
peut contenir la hausse de 89 millions d'articles. La limite est de l'ordre de 61,7 millions d'articles dans le 32-bit runtime.Ce que vous devez faire est de pré-allouer les
HashSet
pour contenir autant d'articles que vous avez besoin. Malheureusement, il n'y a pas direct façon de le faire.HashSet
n'a pas un constructeur qui sera pré-allouer avec une capacité donnée.Toutefois, vous pouvez créer un
List
l'utiliser pour initialiser leHashSet
et ensuite appelerClear
sur leHashSet
. Qui finit par vous donner unHashSet
qui n'a pas d'éléments, mais une capacité de max que vous avez demandé. J'ai montré comment le faire dans un post de blog: Plus sur .Collecte NETTE Tailles.Les limites de la
HashSet
taille sont dues à deux gigaoctets de limite .NET. Aucun objet ne peut être supérieure à deux gigaoctets. Le nombre est en réalité légèrement plus petite, en raison de l'allocation des frais généraux.Pour contourner ce problème, j'ai créé une classe qui implémente HashSet des méthodes et des propriétés (Contient, Ajouter, Nombre, ...), les coulisses et maintient un tableau de HashSets pour stocker les données réelles. La première mise en œuvre seulement à la capacité maximum de chaque HashSet un par un et a déménagé à la prochaine dans le tableau lorsqu'il est plein. Le dernier prend un mod de la clé de hachage que l'index à l'intérieur HashSet tableau. Cela fonctionne bien pour moi, car les touches sont un peu aléatoire de sorte que la distribution des valeurs de la HashSets tableau est jolie même.
À ce point, je pense que vous auriez besoin d'utiliser une base de données de persister vos articles (ou leurs clés de hachage) comme c'est trop d'éléments à stocker de la valeur par défaut .NET des objets. Vous pouvez également créer un objet personnalisé qui a les mêmes propriétés qu'un HashSet, mais qui pourrait être plus de mal que de simplement en utilisant une table de base de données pour stocker les tables de hachage.