Pregunta

Estoy probando lo grande que una colección podría estar en .Net. Técnicamente, cualquier objeto de recogida podía crece con el tamaño de la memoria física.

Luego probó el siguiente código en un Sever, que tiene 16 GB de memoria, ejecuta el servidor Windows 2003 y Visual Studio 2008. He probado tanto F # y C # código, y observó el Administrador de tareas mientras se ejecuta. Puedo ver que después de crecer 2 GB de memoria, el programa se estrelló con la excepción fuera de la memoria. Yo puse la plataforma de destino de 64 bits 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 misma prueba a la href="http://www.itu.dk/research/c5/" rel="noreferrer"> C5 biblioteca colección . El resultado es que el diccionario de C5 podría utilizar toda la memoria. El código utiliza C5:

let d = C5.HashDictionary<int, int> ()
for i=1 to 1000000000 do
    d.Add(i,i)

Cualquier persona sabe por qué?

Otros consejos

En las versiones de .NET anteriores a 4,5, el tamaño máximo objeto es de 2 GB. A partir de 4,5 en adelante se puede asignar objetos más grandes si gcAllowVeryLargeObjects está habilitada. Tenga en cuenta que el límite para string no se ve afectada, pero "conjuntos" debe abarcar "listas" demasiado, ya que las listas están respaldados por las matrices.

Y para que quede claro, un diccionario utiliza una sola matriz para agregar los pares. Se cultiva (duplicado?) Cada vez que se llene. Cuando hay 512 millones de objetos, su tamaño es 2GByte (con un puntero de objeto de 32 bits, y suponiendo una distribución perfecta). Adición de un elemento más hace que el diccionario intentar doblar el tamaño de la matriz de nuevo. Boom.

El C5 HashDictionary usa hashing lineal, y probablemente utiliza una matriz de cubos que contienen cada uno múltiple (16?) Elementos. Debería funcionar en el mismo problema (mucho) más tarde.

El "Permitir objetos grandes" serán solamente ayuda a deshacerse de excepción OOM.

Cuando uno necesita almacenar muchos objetos que el problema que se ve es GC puestos (pausas). Lo que hemos hecho es "esconderse" de los datos de GC, que se convirtió en una solución muy práctica.

Vea esto: https://www.infoq.com/articles/ big-memoria-Parte-3

Se puede usar caché que funciona como un diccionario: https://github.com/aumcode/nfx/tree/ maestro / Fuente / NFX / ApplicationModel / Pila

ver la sección de almacenamiento en caché

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top