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

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

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

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

Ответ 1

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

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

Один из членов команды gcAllowVeryLargeObjects в приложение. конфигурации.

Ответ 2

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

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

Ответ 3

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