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

Ограничения памяти в 64-разрядном приложении .Net?

На моем ноутбуке, работающем на 64-битной Windows 7 и с 2 ГБ свободной памяти (как сообщает диспетчер задач), я могу сделать:

var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 );

Не имея компьютера с большим количеством ОЗУ у меня в руках, мне интересно, будет ли это масштабироваться так, что на компьютере с 4 Гб свободной памятью я смогу выделить 60 М элементов вместо "всего лишь" 30 М и так на?

Или существуют другие ограничения (.Net и/или Windows), с которыми я столкнусь, прежде чем я смогу использовать всю доступную оперативную память?

Обновление: ОК, поэтому мне не разрешено выделять один объект размером более 2 Гб. Это важно знать! Но тогда мне, конечно, интересно узнать, смогу ли я полностью использовать всю память, выделив 2 Гб кусками следующим образом:

  var x = new List<Dictionary<Guid, decimal>>();
  for ( var i = 0 ; i < 10 ; i++ )
    x.Add( new Dictionary<Guid, decimal>( 30 * 1024 *1024 ) );

Будет ли это работать, если на компьютере имеется > 20 ГБ свободной памяти?

4b9b3361

Ответ 1

В .NET существует ограничение на 2 гигабайта для всех объектов, вам никогда не разрешается создавать один объект, который превышает 2 гигабайта. Если вам нужен более крупный объект, вам нужно убедиться, что объекты построены из частей размером менее 2 гигабайт, поэтому вы не можете иметь массив непрерывных бит размером более 2 гигабайт или одну строку длиннее 512 Мбайт, я не полностью уверен в строке, но я провел некоторое тестирование по этой проблеме и получал OutOfMemoryExceptions, когда я пытался выделить строки больше 512 Мбайт.

Эти ограничения, хотя и подвержены фрагментации кучи, и даже если GC пытается скомбинировать кучу, большие объекты (которые в некоторой степени произвольно пересекаются вокруг 80K) оказываются на большой куче объекта, которая представляет собой кучу, которая не является уплотнен. Строго говоря, и, как ни странно, если вы можете поддерживать краткосрочные ассигнования ниже этого порога, было бы лучше для вашего общего управления памятью GC и производительности.

Ответ 2

Обновление. Ограничение памяти для одного объекта 2Gb было снято на 64 бит с выпуском .NET 4.5.

Вам нужно установить gcAllowVeryLargeObjects в свой app.config.

Максимальное количество элементов в массиве все еще равно 2 ^ 32-1.

Подробнее см. Отдельные объекты, все еще ограниченные размером 2 ГБ в CLR 4.0?.