Подтвердить что ты не робот

Ограничение на размер .Net-массива

Я слышал, что существует жесткий предел размера .Net Array. Говорят, что максимальный объем памяти, который может быть выделен для любого экземпляра объекта Array (независимо от того, является ли он int[], double[] или ваш собственный массив) равным 2 ГБ. И нет, если у вас есть 64-разрядная машина, предел 2 ГБ все еще существует.

Я не уверен, правильно ли мое впечатление или нет. Кто-нибудь может подтвердить?

4b9b3361

Ответ 1

Это правильно. Ни один объект не может быть больше 2 ГБ.

Как и в случае с 32-разрядной операционной системой Windows систем, существует ограничение 2 ГБ на размер объекта, который вы можете создать во время запуск 64-битного управляемого приложения в 64-разрядной операционной системе Windows.

У этого вопроса есть дополнительные сведения и некоторые полезные ссылки: Отдельные объекты по-прежнему ограничены размером 2 ГБ в CLR 4.0?

Ответ 2

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

Ответ 3

Сначала вы столкнетесь с практическим ограничением - довольно сложно получить выделенный массив 2gb. Практические ограничения, с которыми я столкнулся, находятся вокруг отметки 800 МБ НА НАЧАЛО ПРОГРАММЫ - после этого резко сократилось.

Все, что больше, чем 64 Мб, - это азартная игра удачи на 32 бит - куча большого объекта не дефрагментирована, поэтому вам нужно 65 МБ бесплатно в одном фрагменте или не удается выполнить выделение.

Теоретические пределы:

  • полезная память, особенно до 32 бит.
  • 32-разрядное числовое пространство для индекса (0 вверх - нет отрицательных чисел для массивов, ЕСЛИ ВЫ НЕ ИМЕЕТЕ СМОТРЕТЬ В СОЗДАНИИ). Вы можете создавать массивы, допускающие отрицательные числа, но не со стандартным синтаксисом С# - только с отражением.
  • 2gb на объект.

Но серьезно, практические последствия больше.

Для .NET 4.0.... рассмотрим использование файлов с отображением памяти;)

Ответ 4

Я бы подумал, что предел может быть в индексе. Я думал, что используемый индекс должен быть целым числом, поэтому ничего большего, чем целое, не будет работать, если у них не будет никакого отношения. Таким образом, это будет 4294967296 элементов. Не уверен, что это даже наполовину верно. Я хотел бы знать сам ответ.

EDIT: Как указывал Томтом, целое число обычно подписывается, если они не используют целое число без знака. Так что половина из 4294967296 или 2147483648 примерно.