¿Cuál es el tamaño máximo que puede contener una matriz?
En C# 2008, ¿cuál es el tamaño máximo que puede contener una matriz?
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.Array
utiliza un Int32
como indexador, por lo que solo Int32
se pueden usar valores válidos para an. Además de esto, sólo >= 0
se 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.MaxValue
y 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 Dictionary
tambié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.
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.
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;
}
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.