Ограничения памяти в 64-битном .Net приложении? - PullRequest
20 голосов
/ 24 мая 2011

На моем ноутбуке под управлением 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 ГБ свободной памяти?

Ответы [ 2 ]

17 голосов
/ 24 мая 2011

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

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

9 голосов
/ 29 мая 2013

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

Вам необходимо установить gcAllowVeryLargeObjects в файле app.config.

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

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

...