Ограничение на размер .Net-массива
Я слышал, что существует жесткий предел размера .Net Array
. Говорят, что максимальный объем памяти, который может быть выделен для любого экземпляра объекта Array
(независимо от того, является ли он int[]
, double[]
или ваш собственный массив) равным 2 ГБ. И нет, если у вас есть 64-разрядная машина, предел 2 ГБ все еще существует.
Я не уверен, правильно ли мое впечатление или нет. Кто-нибудь может подтвердить?
Ответы
Ответ 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 примерно.
Ответ 5
Надеемся на эту помощь: http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx
то есть.
- Он использует индекс int, который имеет максимальное value = 2,147,483,647 (2 ГБ)
- Его по дизайну. 2.