Какова максимальная длина массива в .NET на 64-битной Windows - PullRequest
23 голосов
/ 26 февраля 2010

Я слышал от кого-то, что максимальный размер массива в .NET составляет 4 ГБ? Просто интересно, правда ли это. Вы не мечтали бы сделать это на 32-битной платформе .NET, но на 64-битной системе с 12 ГБ ОЗУ, может быть, просто возможно вы захотите сделать это. : -)

Ответы [ 3 ]

39 голосов
/ 26 февраля 2010

Массив теоретически может содержать не более 2 147 483 647 элементов, поскольку он использует int для индексации. Фактический предел немного ниже, в зависимости от типа, содержащегося в массиве.

Однако в .NET CLR существует ограничение в 2 ГБ для одного объекта, даже в 64-битной версии. Это было сделано по проекту .

Вы можете легко создать реализацию IList<T>, которая внутренне поддерживает несколько массивов и позволяет вырасти за пределы 2 ГБ для одного объекта, но в самой структуре нет ни одного.

Как правило, однако, это не настоящая проблема. В большинстве случаев у вас будут массивы, указывающие на большие классы, поэтому массив просто содержит ссылки. Это означает, что ваш массив может эффективно указывать на множество ГБ памяти, но сам массив не может быть> 2 ГБ.


Обратите внимание, что начиная с версии .NET 4.5 появилась новая опция, позволяющая подписаться на 64-битные приложения: gcAllowVeryLargeObjects . С помощью этого нового набора параметров можно получить UInt32.MaxValue (4 294 967 295) элементов в многомерном массиве, хотя одномерный массив все еще ограничен 2 146 435 071 элементом (2 147 483 591 для однобайтовых массивов или массивов структур, не содержащих ничего байт).

Новые правила с этой опцией:

  • Максимальное количество элементов в массиве - UInt32.MaxValue.
  • Максимальный индекс в любом одном измерении составляет 2 147 483 591 (0x7FFFFFC7) для байтовых массивов и массивов однобайтовых структур и 2 146 435 071 (0X7FEFFFFF) для других типов.
  • Максимальный размер строк и других объектов, не являющихся массивами, не изменяется.
6 голосов
/ 26 июня 2012

В версиях .NET до 4.5 максимальный размер объекта составляет 2 ГБ. Начиная с версии 4.5, вы можете выделять более крупные объекты, если gcAllowVeryLargeObjects включен. Обратите внимание, что ограничение для string не затрагивается, но «массивы» должны также охватывать «списки», поскольку списки поддерживаются массивами.

0 голосов
/ 26 февраля 2010

Максимальный размер любого одного объекта в .NET составляет 2 ГБ.

Это, конечно, жестко ограничивает размер массива необработанных данных.

Вы можете создать «массив массивов» (и даже создать свой собственный индексатор для доступа к ним, как если бы это был один непрерывный массив), достаточно большой, если вам нужно, если вы определите для него свой собственный класс.

...