Qual é o comprimento máximo de uma matriz no .NET no Windows de 64 bits

Eu ouvi de alguém que o tamanho máximo do array no .NET é de 4 GB? Apenas perguntando se isso é verdade. Você não sonharia em fazer isto em .NET de 32 bits, mas em um sistema de 64 bits com 12 GB de RAM, talvez, apenas talvez você queira fazer isso. 🙂

Um array poderia, teoricamente, ter no máximo 2.147.483.647 elementos, já que usa um int para indexação. O limite real é um pouco menor do que isso, dependendo do tipo contido na matriz.

No entanto, há uma restrição máxima de object único de 2 GB no .NET CLR, mesmo em 64 bits. Isso foi feito por design .

Você pode facilmente fazer uma implementação IList que, internamente, mantém vários arrays e permite que você cresça além do limite de object único de 2 GB, mas não há um no próprio framework.

Normalmente, no entanto, isso não é um problema real. Na maioria das vezes, você terá arrays apontando para grandes classs – então o array está apenas mantendo referências. Isso significaria que seu array pode efetivamente apontar muitos GBs de memory – mas o array em si não pode ser> 2 GB.


Observe que, a partir do .NET 4.5, há uma nova opção disponível onde os aplicativos de 64 bits podem aceitar : gcAllowVeryLargeObjects . Com esse novo conjunto de opções, é possível obter elementos UInt32.MaxValue (4.294.967.295) em uma multidimensional array, embora uma matriz dimensional única ainda esteja limitada a 2.146.435.071 elementos (2.147.483.591 para matrizes de byte único ou matrizes de uma estrutura contendo nada ut um byte).

As novas regras com esta opção são:

  • O número máximo de elementos em uma matriz é UInt32.MaxValue.
  • O índice máximo em qualquer dimensão única é 2.147.483.591 (0x7FFFFFC7) para matrizes de bytes e matrizes de estruturas de byte único e 2.146.435.071 (0X7FEFFFFF) para outros tipos.
  • O tamanho máximo para strings e outros objects não matriciais é inalterado.

Nas versões do .NET anteriores ao 4.5, o tamanho máximo do object é de 2 GB. A partir de 4.5, você pode alocar objects maiores se gcAllowVeryLargeObjects estiver ativado. Observe que o limite de string não é afetado, mas “arrays” também devem cobrir “listas”, já que as listas são suportadas por arrays.

O tamanho máximo de qualquer object no .NET é de 2 GB.

Isso, é claro, coloca um limite rígido em quão grande você pode fazer um array bruto.

Você pode criar um “array de arrays” (e até mesmo criar seu próprio indexador para acessá-los como se fosse um array contíguo) tão grande quanto quiser se você definir sua própria class para isso.