Исключение C # OutOfMemoryException с большим массивом

#c# #out-of-memory

#c# #не хватает памяти

Вопрос:

Для моего упражнения по программированию на C # я пытаюсь создать массив long с длиной 0x1fffffff (536 870 911 в base10), однако я получил System.Исключение OutOfMemoryException.

Для сборки я выбрал систему x64, и я запускаю VisualStudio2008 на Windows7 x64 с 8 ГБ оперативной памяти. Для массива должно быть достаточно памяти (это работает на JDK x64 и CPP project)

Есть мысли?

         const long MAX = 0x1fffffff; // 536870911 in base10
        program.arr = new long[MAX];
        for (long i = 0; i < MAX; i  )
        {
            program.arr[i] = i;                
        }
  

Комментарии:

1. К вашему сведению, это называется «C #», а не «CSharp».

2. Вы не можете сделать объект таким большим. Но даже если бы вы могли, вы, похоже, также страдаете от неправильного понимания того, что RAM определяет, сколько памяти вы можете выделить. Этого не происходит, и не происходило десятилетиями. Объем оперативной памяти ограничивает то, насколько быстро вы сможете получить доступ к этой памяти. Наличие большого объема оперативной памяти — это оптимизация производительности; распределение памяти на самом деле лучше всего рассматривать как выделение из файла подкачки. Помните, когда вы выделяете память, вы выделяете виртуальную память , а не аппаратную память .

Ответ №1:

Среда CLR не поддерживает ни одного объекта размером более примерно 2 ГБ. Вы запрашиваете массив из 4 294 967 288 байт — в два раза больше, чем поддерживается.

Вы можете использовать такой объем памяти, но не в одном объекте (таком как массив).

Ответ №2:

Трудно рекомендовать какую-либо значимую альтернативу, поскольку вы не указываете, чего вы пытаетесь достичь, только то, что вы не можете сделать.

Тем не менее, если вам действительно нужно что-то, что представляет собой быстрый непрерывный просмотр в плоском адресном пространстве размером более 2 ГБ, вы могли бы использовать MemoryMappedFile.

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

Ответ №3:

Создайте подмножество массива, затем заполните массив

yourary[]

masterarray[] <—— Заполните ваш буфер [] объемом до 2 ГБ, затем добавьте его в masterarray