Очень большой массив в куче (Visual C ++) - PullRequest
2 голосов
/ 11 сентября 2010

Я надеюсь, что кто-то может мне помочь, я пытаюсь создать массив int [400000000] (400 миллионов) в моем приложении, используя Visual C ++ 2010, но он выдает ошибку переполнения Тот же код работает на Linux с G ++. Мне это нужно, потому что я работаю с большими матрицами. Заранее спасибо.

Ответы [ 6 ]

14 голосов
/ 11 сентября 2010

Если вы используете 32-разрядное приложение, то по умолчанию у вас есть только 2 ГБ адресного пространства пользователя. 400 миллионов целых чисел - это около 1,5 ГБ. Скорее всего, у вас не будет такого непрерывного адресного пространства. Можно заставить 32-битные окна выделять 3 ГБ адресного пространства пользователя для каждого процесса, но это может быть просто пробелом для вашей ситуации.

Если вы можете перейти на 64-битную архитектуру, то это не должно быть проблемой; в противном случае вы должны найти способ хранения ваших матричных данных таким образом, чтобы не требовалось ни одного блока непрерывного хранения, например, для хранения их в виде фрагментов.

3 голосов
/ 11 сентября 2010

Я думаю, что вам нужен алгоритм «Разделяй и властвуй».Не место памяти.

1 голос
/ 11 сентября 2010

Возможно, разреженные матрицы могут использоваться в вашем приложении. Эта концепция используется при работе с большими матрицами, которые имеют много записей 0, что может иметь место в довольно многих приложениях.

И, кстати, вы ничего не получите, храня такое огромное количество данных в куче. Учтите, что кэш вашего процессора имеет около 12 МБ! По крайней мере, используйте интеллектуальный механизм динамического выделения памяти.

1 голос
/ 11 сентября 2010

Я не уверен, что в вашем случае было бы даже лучше использовать STXXL .

0 голосов
/ 14 сентября 2010

Я только что нашел очень простое решение, но я не знаю, целесообразно ли оно

int tab[400000000]={0};//global array

int main(array<System::String ^> ^args)
{
std::cout<<tab[399999999]<<std::endl;//ok

/*
int* tab=new int[400000000];//doesn't work
...
delete[] tab;
*/
    return 0;
}
0 голосов
/ 11 сентября 2010

Нужно ли выделять весь массив?Вы действительно используете весь массив?Это массив с множеством 0?если это так, то можно объяснить тот факт, что он лучше работает на Linux.

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

...