Я надеюсь, что кто-то может мне помочь, я пытаюсь создать массив int [400000000] (400 миллионов) в моем приложении, используя visual C++ 2010, но он генерирует ошибку переполнения Тот же код работает на linux с g ++. Мне нужно это, потому что я работаю с большими матрицами. Спасибо заранее.Очень большой массив на куче (Visual C++)
ответ
Я не уверен, что в вашем случае было бы не лучше использовать STXXL.
Если вы используете 32-битное приложение, то по умолчанию у вас есть только 2 ГБ адресного пространства пользователя. 400 миллионов целых чисел - около 1,5 ГБ. Вы, скорее всего, не будете иметь такого многогранного адресного пространства. Можно заставить 32-битные окна выделять адресное пространство на 3 ГБ для каждого процесса, но это может быть просто остановкой для вашей ситуации.
Если вы можете перейти на 64-битную архитектуру, это не должно быть проблемой; в противном случае вы должны найти способ хранения ваших матричных данных таким образом, чтобы не требовать одного блока непрерывного хранения, например, хранить его в кусках.
+1, то есть 650 МБ - это все, что вы можете ожидать. Хранение матрицы в более умной структуре данных * очень важно для скорости. –
Для скорости это зависит от ваши шаблоны доступа. Для прямого линейного прохождения данных разница между операционными системами, разбивающимися по старым страницам и стратегией ручного кэширования, может быть ничем. Если (например!) вы выполняете матричное умножение на матрицах 20000 x 20000, это очень трудно придумать быструю стратегию, так как вам нужно объединить числа из всех областей матриц во всех комбинациях. –
@Charles: Не * это * сложно. Просто нужно использовать блокировку :) – jalf
Нужно ли выделять весь массив? действительно ли вы используете весь массив? Это массив с большим количеством 0? если это так, то объясняется тот факт, что он работает лучше на linux.
В этом случае использование разреженного массива может быть более уместным. Использование существующей разреженной реализации массива уменьшит объем памяти и, возможно, позволит быстрее вычислять.
Я думаю, что вам нужен алгоритм Divide-and-Conquer. Не пространство памяти.
Это не помогает – eddyq
Возможно, sparse matrices подходит для вашего применения. Эта концепция используется при работе с большими матрицами, которые содержат много 0 записей, что может иметь место в довольно многих приложениях.
И, кстати, вы ничего не получаете, сохраняя такое огромное количество данных в куче. Считайте, что ваш кэш вашего процессора имеет, возможно, 12 МБ! По крайней мере, используйте механизм интеллектуального динамического распределения памяти.
я нашел очень простое решение, но я не знаю, если это целесообразно
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;
}
Ваше решение здесь чтобы захватить адресное пространство очень рано. Не полагайтесь на это, работая для такого большого блока на 32 битах, он будет хрупким для окружающей среды. – morechilli
- 1. C++ не может выделить слишком большой массив объектов на куче
- 2. Многомерный массив на куче - C
- 3. Очень большой массив
- 4. Как отсортировать очень большой массив в C
- 5. Очень большой массив - массив C массивов против C++. Visual Studio - превышает max (268435456)
- 6. Разрабатывая очень большой массив в Python
- 7. Очень, очень, очень большой div
- 8. Разделение очень большой строки
- 9. Могу ли я объявить очень большой массив в классе, C++
- 10. Объявление и инициализация очень больших массивов на куче
- 11. Динамический многомерный массив на куче
- 12. C++ Многомерные массивы на куче
- 13. Определите, содержит ли очень большой массив дубликат
- 14. Очень большой массив (непрерывный кусок памяти)
- 15. C# сериализуйте большой массив на диск
- 16. Функция Mathematica, которая возвращает очень большой массив, очень медленная
- 17. StringIndexOutOfBoundsException на очень большой строке
- 18. Массив структур на куче не инициализирован
- 19. большой массив 2d в C++ (возможно?)
- 20. XOR на очень большой файл
- 21. Создать большой массив в C++
- 22. Большой динамический массив в C++
- 23. Поиск транспонирования очень, очень большой матрицы
- 24. Компиляция очень большой .cpp файлу
- 25. Плавающее значение, дающее очень большой ответ (C)
- 26. преобразовать очень большой экспоненциальной десятичной в C#
- 27. Как структурировать очень большой класс Objective-C?
- 28. Инициализация массивов векторов в куче, C++
- 29. Сравните массив с «очень большой» таблицей базы данных SQL Server
- 30. Определить массив определенного пользователем типа на куче
вы пытаетесь создать динамически? – cripox
Возможно, если вы разделите основную проблему, которую пытаетесь решить, мы сможем оказать большую помощь. –
На некоторых системах существует ограничение на размер фрейма стека. Вы можете столкнуться с этим. Используйте std :: vector <>, чтобы узнать, разрешает ли это проблема (в противном случае вы просто теряете память. –