#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