2015-03-13 4 views
1

Я хотел бы создать два массива элементов 200M int. Как что:Что такое ограничение размера массива в C#?

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

namespace Arr 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 

      int Min = 0; 
      int Max = 10; 
      int ArrSize = 200000000; 

      int[] test2 = new int[ArrSize]; 
      int[] test3 = new int[ArrSize]; 

      Console.ReadKey(); 

     } 
    } 
} 

Однако под VS2013, я получаю из исключения памяти с желтой стрелкой, указывающей на int[] test3 = new int[ArrSize]; линии. Аппарат имеет 12 ГБ оперативной памяти.

Если я уменьшу количество элементов до 150 М, исключение исключений не будет.

Если я инициализирую только один массив размером 200 М, исключение не будет выбрано.

Почему?

+0

Нет, этот вопрос не имеет ответа по указанной вами ссылке. 200M ints составляет 800 МБ. Почему этот размер подходит для первого объекта, но не для второго? – user1146081

+0

Этот вопрос определенно не о размере одного объекта, а об общем размере нескольких объектов. Возобновлено. –

+0

@PetSerAl - очевидно 32bit. x64 не удастся с единичным распределением около 500M, 32-разрядный сбой при попытке найти 2 непрерывных блока 800Mb (что смехотворно сложно), обычно нормально. –

ответ

6

Машина имеет 12 ГБ оперативной памяти.

влияет на скорость вашей программы (в зависимости от того, насколько это бесплатно), но размер физической памяти не влияет на успех распределения или отказ. Это определяется доступным адресным пространством.

Если вы компилируете 32-разрядную версию, особенно если you are not using the /LARGEADDRESSAWARE option, то вы сможете выделить только несколько больших объектов, поскольку они должны вписываться в одно адресное пространство 2 ГБ, и это пространство разбивается на DLL и другие распределения.

Это хорошая идея использовать 64-битные, если вам действительно нужны объекты, большие. Для 32-битных программ вы можете обойти это частично, разбив свои объекты на более мелкие куски, увеличив вероятность нахождения свободной области адресного пространства достаточно большой.

Настройки по умолчанию для консольного приложения C# в VS 2013 - «AnyCPU», с «Предпочитают 32-разрядные».

Этот параметр можно изменить на вкладке «Свойства проекта ->». enter image description here

+0

Важно отметить, что системное пространство должно быть смежным, поэтому даже если ваш монитор ресурсов Windows говорит, что у вас есть 2 ГБ свободной памяти в ОЗУ, это может быть не непрерывная память. – Xantix

+2

@ Xantix: Когда я говорю «пространство разбито», я говорю о соприкосновении. И вы полностью упустили точку, если вы смотрите на Free RAM, потому что неудачи распределения вызваны отсутствием (смежным) адресным пространством, а не отсутствием ОЗУ. Если RAM отсутствует, файл swap будет использоваться. –

Смежные вопросы