2010-09-11 2 views
2

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

+0

вы пытаетесь создать динамически? – cripox

+1

Возможно, если вы разделите основную проблему, которую пытаетесь решить, мы сможем оказать большую помощь. –

+1

На некоторых системах существует ограничение на размер фрейма стека. Вы можете столкнуться с этим. Используйте std :: vector <>, чтобы узнать, разрешает ли это проблема (в противном случае вы просто теряете память. –

ответ

1

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

14

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

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

+1

+1, то есть 650 МБ - это все, что вы можете ожидать. Хранение матрицы в более умной структуре данных * очень важно для скорости. –

+1

Для скорости это зависит от ваши шаблоны доступа. Для прямого линейного прохождения данных разница между операционными системами, разбивающимися по старым страницам и стратегией ручного кэширования, может быть ничем. Если (например!) вы выполняете матричное умножение на матрицах 20000 x 20000, это очень трудно придумать быструю стратегию, так как вам нужно объединить числа из всех областей матриц во всех комбинациях. –

+0

@Charles: Не * это * сложно. Просто нужно использовать блокировку :) – jalf

0

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

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

3

Я думаю, что вам нужен алгоритм Divide-and-Conquer. Не пространство памяти.

+0

Это не помогает – eddyq

1

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

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

0

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

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

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

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