HashSet
grows by doubling. Entonces, cuando tiene 23.997.907 elementos en la lista e intenta agregar el siguiente, intenta duplicar el tamaño de su matriz de respaldo. Y esa asignación hace que exceda la memoria disponible. Supongo que está ejecutando esto en un sistema de 32 bits, porque en un sistema de 64 bits, un HashSet<object>
puede contener más de 89 millones de elementos. El límite es de aproximadamente 61.7 millones de elementos en el tiempo de ejecución de 32 bits.
Lo que debe hacer es asignar previamente HashSet
para contener tantos elementos como necesite. Lamentablemente, no hay directa manera de hacerlo. HashSet
no tiene un constructor que lo preasigne con una capacidad determinada.
Puede, sin embargo, crear un List
, lo utilizan para inicializar el HashSet
, y luego llamar a Clear
en el HashSet
. Eso termina dándole un HashSet
que no tiene elementos, pero una capacidad máxima que usted solicitó. Mostré cómo hacer eso en una publicación de blog: More on .NET Collection Sizes.
Los límites en el tamaño HashSet
se deben al límite de dos gigabytes en .NET. Ningún objeto puede ser más grande que dos gigabytes. El número es en realidad un poco más pequeño, debido a gastos generales de asignación.
Sólo por pura curiosidad: ¿para qué necesitas esto? –
http://blog.mischel.com/2008/04/09/hashset-limitations/ –
@MikeNakis: como se menciona en la publicación, necesitamos mantener una colección única de alto rendimiento de número entero para satisfacer algunos de nuestros requisitos – Debasis