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

Насколько я понимаю, существует ограничение в 2 ГБ для отдельных экземпляров в.NET. Я не обращал на это особого внимания, поскольку до сих пор работал в основном на 32-битных ОС. На 32 но это более или менее искусственное ограничение в любом случае. Тем не менее, я был очень удивлен, узнав, что это ограничение также распространяется на 64-разрядные.NET.

Так как коллекции, такие как List<T> использовать массив для хранения элементов, это означает, что приложение.NET, работающее в 32-разрядной среде, сможет хранить в списке вдвое больше элементов ссылочного типа по сравнению с тем же приложением, работающим в 64-разрядной системе. Это довольно удивительно, IMO.

Кто-нибудь знает, учтено ли это ограничение в CLR 4.0 (сейчас у меня под рукой нет установки 4.0).

3 ответа

Решение

Это еще хуже - вы занимаетесь процессным пространством, когда вы работаете в.NET в 32-битной системе, что намного меньше теоретического предела. В 32-битных приложениях.NET мой опыт показывает, что вы всегда будете склонны начинать получать ошибки памяти где-то в пределах 1,2-1,4 ГБ памяти (некоторые люди говорят, что они могут получить 1,6... но я никогда не видел этого). Конечно, это не проблема для 64-битных систем.

При этом единый массив ссылочных типов 2 ГБ, даже в 64-битных системах, представляет собой огромное количество объектов. Даже с 8-байтовыми ссылками у вас есть возможность выделить массив из 268 435 456 ссылок на объекты - каждая из которых может быть очень большой (до 2 ГБ, больше, если они используют вложенные объекты). Это больше памяти, чем требовалось большинству приложений.

Один из членов команды CLR написал об этом в блоге, с некоторыми вариантами способов обойти эти ограничения. В 64-битной системе выполнение чего-то вроде его BigArray было бы жизнеспособным решением для размещения любого количества объектов в массиве - намного больше, чем ограничение в 2 ГБ для одного объекта. P/Invoke также позволяет выделять большие массивы.


Изменить: Я должен был упомянуть об этом, а также - я не думаю, что это поведение изменилось для.NET 4. Поведение не изменилось с самого начала.NET.


Изменить: .NET 4.5 теперь будет иметь возможность в x64 явно разрешить объекты размером более 2 ГБ, установив gcAllowVeryLargeObjects в app.config.

.NET Framework 4.5 позволяет создавать массивы размером более 2 ГБ на 64-битных платформах. Эта функция не включена по умолчанию, ее необходимо включить через файл конфигурации с помощью элемента gcAllowVeryLargeObjects.

http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx

Это большое дело в области чисел. Любой, кто использует числовые библиотеки классов в.NET, хранит свои матрицы в виде массивов. Это так, чтобы нативные библиотеки можно было вызывать для вычисления числа. Ограничение в 2 ГБ серьезно ограничивает размер матриц, возможных в 64-битном.NET. Больше здесь.

Другие вопросы по тегам