2010-01-05 10 views
30

¿Alguien sabe cuál es el número máximo de artículos en una lista?¿Cuál es el máximo de elementos en una lista <T>?

¿Cómo puedo aumentar ese tamaño? ¿O hay una colección que tiene elementos infinitos? (Tanto como cabría en la memoria, se entiende)

EDIT:

consigo una excepción de memoria insuficiente cuando el conde = 134217728 en una lista de enteros. tiene 3Gb de RAM de los cuales 2.2 están en uso. Sonido normal

+0

@Tony - se mencionan (comentarios) que su memoria se debe agotando rápidamente ... cuál es el problema real es usted ¿viendo? –

+0

@Marc, edité mi publicación con el problema –

+0

Respuesta actualizada a tu actualización –

Respuesta

53

List<T> se limitará al máximo de una matriz, que es de 2 GB (incluso en x64). Si eso no es suficiente, estás usando el tipo incorrecto de almacenamiento de datos. Sin embargo, puede ahorrar un montón de sobrecarga empezando por el tamaño correcto, pasando un int al constructor.

Vuelva a su edición - con 134217728 x Int32, eso es 512MB. Recuerde que List<T> usa un algoritmo de duplicación; Si está alimentando por goteo artículos a través de Add (sin asignar todo el espacio primero) va a tratar de duplicar a 1GB (en la parte superior de los 512MB que ya tiene, el resto de su aplicación, y por supuesto la Tiempo de ejecución de CLR y bibliotecas). Supongo que está en x86, por lo que ya tiene un límite de 2 GB por proceso, y es probable que haya fragmentado su "montón de objetos grandes" en muerte mientras agrega elementos.

Personalmente, sí, parece correcto comenzar a obtener una memoria insuficiente en este punto.


Editar: en .NET 4.5, se permiten matrices de más de 2 GB si se ha activado el interruptor de <gcAllowVeryLargeObjects>. El límite entonces es de 2^31 elementos. Esto podría ser útil para matrices de referencias (8 bytes cada una en x64), o una matriz de grandes struct s.

+0

Quieres decir 2^31 elementos, ¿verdad? –

+7

No, me refiero a 2GB de memoria, como lo impone el CLR. Para los tipos de referencia, eso significa (en x64) 8 bytes por referencia, así que divídelo unas pocas veces más ;-p –

+4

Un efecto secundario interesante de lo anterior es que ** en teoría ** podría tener más referencias en un matriz en x86. En realidad, en x86 nunca logrará asignar una matriz que big * y * tengan espacio para colocar objetos útiles (y diferentes) en ella ... En cualquier caso, una lista/matriz de este tamaño es simplemente mal. –

1

Está limitado solo por la memoria.

editar: o no, 2Gb es el límite! Esto es bastante interesante, BigArray, getting around the 2GB array size limit

+0

entonces mi memoria se está agotando rápidamente?!? –

+1

No solo está limitado por la memoria, existe un límite estricto debido al respaldo de matriz subyacente. – Paolo

0

La lista crecerá dinámicamente para acomodar tantos elementos como desee incluir, ¡hasta que exceda la memoria disponible!

De la documentación de MSDN:

Si Contador ya es igual a la capacidad, la capacidad de la lista se incrementa mediante la reasignación automática la matriz interna, y los elementos existentes se copian en la nueva matriz antes de añadir el nuevo elemento.

Si Count es menor que Capacidad, este método es una operación O (1). Si la capacidad necesita aumentarse para acomodar el nuevo elemento, este método se convierte en una operación O (n), donde n es Count.

+0

Obtengo una excepción de falta de memoria cuando Count = 134217728 en una lista de entradas. tiene 3Gb de RAM de los cuales 2.2 están en uso. ¿Suena normal? –

+0

Parece que está utilizando medio gigabyte (tantos bytes * 4 bytes/int32) solo para esa lista. Probablemente estés presionando el límite allí. ¿NECESITAS contar para ser tan alto? Puede inicializar la lista sin Count. – Sapph

+0

El conteo se pone tan alto, pero puedo resolverlo de otra manera. Gracias por todas sus respuestas. ¡Me ayudó! –

0

El límite de lista es de 2,1 mil millones de objetos o el tamaño de la memoria que se golpea primero.

+0

No, eso no es correcto. Ningún objeto puede tener más de 2 GB, por lo que la matriz que contiene las referencias o valores reales lo limitará significativamente. –

+0

No exactamente, varía según el tipo de objeto almacenado ... El límite de la lista para 'int', por ejemplo, es solo 268435456 para procesos de 64 bits. – Vlad

0

La interfaz define Count e IndexOf, etc. como tipo int, por lo que supondría que int.MaxValue o 2.147.483.647 es la cantidad máxima de elementos que podría incluir en una lista.

Realmente tengo que preguntar por qué demonios necesitaría tantos, es probable que haya un enfoque más sensato para la gestión de los datos.

1

En una máquina x64, usando .Net Framework 4 (No el perfil de cliente), compilando para cualquier CPU en modo de liberación, podría masticar toda la memoria disponible. Mi proceso ahora es de 5.3GB y he consumido toda la memoria disponible (8GB) en mi PC. En realidad es un servidor 2008 R2 x64.
que utiliza una clase de colección personalizada basada en CollectionBase para almacenar 61,910,847 instancias de la clase siguiente:

public class AbbreviatedForDrawRecord { 
    public int DrawId { get; set; } 
    public long Member_Id { get; set; } 
    public string FactorySerial { get; set; } 

    public AbbreviatedForDrawRecord() { 

    } 

    public AbbreviatedForDrawRecord(int drawId, long memberId, string factorySerial) { 
     this.DrawId = drawId; 
     this.Member_Id = memberId; 
     this.FactorySerial = factorySerial; 
    } 
} 
Cuestiones relacionadas