¿Cuál es el tamaño máximo que puede contener una matriz?

Resuelto DNR asked hace 14 años • 7 respuestas

En C# 2008, ¿cuál es el tamaño máximo que puede contener una matriz?

DNR avatar Sep 08 '09 09:09 DNR
Aceptado
System.Int32.MaxValue

Suponiendo que te refieres a System.Array, es decir. cualquier matriz normalmente definida ( int[], etc.). Este es el número máximo de valores que puede contener la matriz. El tamaño de cada valor sólo está limitado por la cantidad de memoria o memoria virtual disponible para contenerlos.

Este límite se aplica porque System.Arrayutiliza un Int32como indexador, por lo que solo Int32se pueden usar valores válidos para an. Además de esto, sólo >= 0se pueden utilizar valores positivos (es decir, ). Esto significa que el límite superior máximo absoluto del tamaño de una matriz es el límite superior máximo absoluto de los valores de an Int32, que está disponible en Int32.MaxValuey es equivalente a 2^31, o aproximadamente 2 mil millones.

En una nota completamente diferente, si esto te preocupa, es probable que estés usando muchos datos, ya sea correcta o incorrectamente. En este caso, consideraría usar un List<T>en lugar de una matriz, de modo que solo uses tanta memoria como sea necesaria. De hecho, recomendaría usar uno List<T>u otro de los tipos de colecciones genéricas todo el tiempo. Esto significa que sólo se asignará tanta memoria como la que realmente estás usando, pero puedes usarla como lo harías con una matriz normal.

La otra colección a destacar es Dictionary<int, T>que también puedes usarla como una matriz normal, pero solo estará escasamente poblada. Por ejemplo, en el siguiente código, solo se creará un elemento, en lugar de los 1000 que crearía una matriz:

Dictionary<int, string> foo = new Dictionary<int, string>();
foo[1000] = "Hello world!";
Console.WriteLine(foo[1000]);

El uso Dictionarytambién le permite controlar el tipo de indexador y le permite utilizar valores negativos. Para la matriz dispersa de tamaño máximo absoluto, puede usar a Dictionary<ulong, T>, que proporcionará más elementos potenciales de los que podría imaginar.

Matthew Scharley avatar Sep 08 '2009 02:09 Matthew Scharley

Según MSDN es

De forma predeterminada, el tamaño máximo de una matriz es 2 gigabytes (GB).

En un entorno de 64 bits, puede evitar la restricción de tamaño estableciendo el atributo enable del elemento de configuración gcAllowVeryLargeObjects en verdadero en el entorno de ejecución.

Sin embargo, la matriz seguirá estando limitada a un total de 4 mil millones de elementos .

Consulte aquí http://msdn.microsoft.com/en-us/library/System.Array(v=vs.110).aspx

Nota: Aquí me estoy centrando en la longitud real de la matriz asumiendo que tendremos suficiente RAM de hardware.

Sai avatar Apr 23 '2014 17:04 Sai

Esta respuesta es sobre .NET 4.5

Según MSDN , el índice de una matriz de bytes no puede ser mayor que 2147483591. Para .NET anterior a 4.5 también era un límite de memoria para una matriz. En .NET 4.5 este máximo es el mismo, pero para otros tipos puede ser hasta 2146435071.

Este es el código a modo de ilustración:

    static void Main(string[] args)
    {
        // -----------------------------------------------
        // Pre .NET 4.5 or gcAllowVeryLargeObjects unset
        const int twoGig = 2147483591; // magic number from .NET

        var type = typeof(int);          // type to use
        var size = Marshal.SizeOf(type); // type size
        var num = twoGig / size;         // max element count

        var arr20 = Array.CreateInstance(type, num);
        var arr21 = new byte[num];

        // -----------------------------------------------
        // .NET 4.5 with x64 and gcAllowVeryLargeObjects set
        var arr451 = new byte[2147483591];
        var arr452 = Array.CreateInstance(typeof(int), 2146435071);
        var arr453 = new byte[2146435071]; // another magic number

        return;
    }
Anton K avatar Sep 15 '2014 20:09 Anton K

Aquí hay una respuesta a su pregunta que entra en detalles: http://www.velocityreviews.com/forums/t372598-maximum-size-of-byte-array.html

Es posible que desee mencionar qué versión de .NET está utilizando y el tamaño de su memoria.

Estarás atascado en un 2G, aunque para tu aplicación hay un límite, por lo que depende de lo que haya en tu matriz.

James Black avatar Sep 08 '2009 02:09 James Black