¿Cuál es la longitud máxima de una matriz en .NET en Windows de 64 bits

Escuché de alguien que el tamaño máximo de la matriz en .NET es de 4 GB? Me pregunto si eso es verdad. No soñaría con hacer esto en .NET de 32 bits, pero en un sistema de 64 bits con 12 GB de RAM, tal vez, tal vez podría querer hacer esto. 🙂

Una matriz podría teóricamente tener un máximo de 2.147.483.647 elementos, ya que utiliza una int para la indexación. El límite real es ligeramente más bajo que esto, dependiendo del tipo que contenga la matriz.

Sin embargo, hay una restricción máxima de objeto único de 2 GB en .NET CLR, incluso en 64 bits. Esto fue hecho por diseño .

Puede realizar fácilmente una implementación IList que, internamente, mantenga varias matrices y le permita crecer más allá del límite de objetos únicos de 2GB, pero no hay una en el marco mismo.

Típicamente, sin embargo, esto no es un problema real. La mayoría de las veces, tendrá matrices apuntando a clases grandes, por lo que la matriz solo contiene referencias. Esto significaría que su matriz efectivamente puede apuntar a muchos, muchos GB de memoria, pero la matriz en sí no puede ser> 2 GB.


Tenga en cuenta que, a partir de .NET 4.5, hay una nueva opción disponible donde las aplicaciones de 64 bits pueden optar por: gcAllowVeryLargeObjects . Con esta nueva opción configurada, es posible obtener elementos UInt32.MaxValue ( UInt32.MaxValue ) en una matriz multidimensional, aunque una matriz dimensional única aún está limitada a 2,146,435,071 elementos (2,147,483,591 para matrices de un solo byte o matrices de una estructura que no contiene nada ut un byte).

Las nuevas reglas con esta opción son:

  • La cantidad máxima de elementos en una matriz es UInt32.MaxValue.
  • El índice máximo en cualquier dimensión individual es 2.147.483.591 (0x7FFFFFC7) para matrices de bytes y matrices de estructuras de un solo byte, y 2.146.435.071 (0X7FEFFFFF) para otros tipos.
  • El tamaño máximo para cadenas y otros objetos que no son de matriz no se modifica.

En las versiones de .NET anteriores a 4.5, el tamaño máximo del objeto es de 2 GB. A partir de 4.5, puede asignar objetos más grandes si está habilitado gcAllowVeryLargeObjects . Tenga en cuenta que el límite para la string no se ve afectado, pero las “matrices” también deberían cubrir las “listas”, ya que las listas están respaldadas por matrices.

El tamaño máximo de cualquier objeto en .NET es de 2 GB.

Esto, por supuesto, pone una tapa dura sobre qué tan grande puede hacer una matriz en bruto.

Puede crear una “matriz de matrices” (e incluso crear su propio indizador para acceder a ellas como si fuera una matriz contigua), casi tan grande como desee si define su propia clase para ella.