Я надеюсь, что кто-нибудь может мне помочь, я пытаюсь создать массив int[400000000] (400 миллионов) в своем приложении с помощью Visual C++ 2010, но он генерирует ошибку переполнения. Тот же код работает в Linux с g++. Мне это нужно, потому что я работаю с большими матрицами. Заранее спасибо.
Очень большой массив в куче (Visual C++)
Ответы (6)
Если вы используете 32-разрядное приложение, то по умолчанию у вас есть только 2 ГБ пользовательского адресного пространства. 400 миллионов целых чисел составляют около 1,5 ГБ. Скорее всего, у вас нет такого большого непрерывного адресного пространства. Можно заставить 32-разрядные окна выделять 3 ГБ пользовательского адресного пространства для каждого процесса, но это может быть временным промежутком в вашей ситуации.
Если вы можете перейти на 64-битную архитектуру, это не должно быть проблемой; в противном случае вам следует найти способ хранения ваших матричных данных таким образом, чтобы не требовался единый блок непрерывного хранилища, например, сохранение его в кусках.
Я думаю, что вам нужен алгоритм «разделяй и властвуй». Не место в памяти.
Возможно, в вашем приложении используются разреженные матрицы. Эта концепция используется при работе с большими матрицами, в которых много нулевых элементов, что может иметь место во многих приложениях.
И кстати, вы ничего не выигрываете, храня такое огромное количество данных в куче. Учтите, что кэш вашего процессора может быть 12 МБ! По крайней мере, используйте какой-нибудь интеллектуальный механизм динамического распределения памяти.
Действительно ли нужно выделять весь массив? вы действительно используете весь массив? Это массив с большим количеством 0? если это так, то можно объяснить тот факт, что он лучше работает в linux.
В этом случае использование разреженного массива может быть более подходящим. Использование существующей реализации разреженного массива уменьшит объем памяти и, возможно, позволит ускорить вычисления.
Я только что нашел очень простое решение, но я не знаю, целесообразно ли это
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;
}