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

StackOverflow https://stackoverflow.com/questions/1087982

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Один из членов Команда CLR написала об этом в блоге, с некоторыми вариантами обхода этих ограничений.В 64-битной системе выполнение чего-то вроде BigArray<T> было бы жизнеспособным решением для размещения любого количества объектов в массиве - намного больше, чем ограничение на один объект в 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.Более здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top