Estoy probando qué tan grande podría ser una colección en .Net. Técnicamente, cualquier objeto de colección podría crecer al tamaño de la memoria física.La colección muy grande en .Net causa la excepción de falta de memoria
Luego probé el siguiente código en un servidor que tiene 16 GB de memoria, ejecutando Windows 2003 Server y Visual Studio 2008. Probé tanto el código F # como el código C# y miré al Administrador de tareas mientras estaba en ejecución. Puedo ver que después de aumentar la memoria de 2GB, el programa se bloqueó con la excepción de falta de memoria. Establecí la plataforma objetivo en x64 en la página de propiedades.
open System.Collections.Generic
let d = new Dictionary<int, int>()
for i=1 to 1000000000 do
d.Add(i,i)
Hice una prueba de la biblioteca de colecciones C5. El resultado es que el diccionario en C5 podría agotar toda la memoria. El código usa C5:
let d = C5.HashDictionary<int, int>()
for i=1 to 1000000000 do
d.Add(i,i)
¿Alguien sabe por qué?
memoria física no tiene nada que ver con tamaños máximos. Windows ha utilizado la gestión de memoria virtual durante más de una década. Puede tener objetos que son mucho, mucho más grandes que la memoria física disponible porque, por supuesto, la memoria física disponible podría ser * cero * cuando se crea un nuevo proceso. Ese es el * punto * completo de la memoria virtual; esa memoria física es solo una optimización del rendimiento de la memoria virtual. (Si no hay suficiente memoria física para contener el conjunto de trabajo, el rendimiento se degrada, pero todo debería funcionar aún *.) –
@EricLippert Entendido y aceptado, pero ¿qué pasa con el reverso? ¿Alguna vez recibirás un OOM cuando hay memoria física? ¿disponible? (suponiendo que es un OOM real no demasiados controladores/problema similar). En este caso, parece que el límite fue un límite impuesto por CLR, pero eso solo significa que la pregunta de OP es buena, en mi opinión – Basic