Размер матрицы EIGEN MAX для 32 битных приложений
Вопрос
Итак, я нахожу Натуральный Пакет падает, когда я пытаюсь объявить матрицу больше 10000х10000. Мне нужно объявить матрицу, как это. Около 13000х13000 элементов надежно. Я провел тест, как:
for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ )
{
printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ;
Eigen::MatrixXd m( tortureEigen, tortureEigen ) ;
}
Вылетает на мою машину (6 ГБ ОЗУ) на 14008 элементах.
Я разочарован! Я подумал, что EIGEN был как Matlab или Octave и не должен падать, используя большие массивы, даже если он ударит на диск или что-то ..
И что еще больше, когда я запускаю этот тест, и удерживайте Taskman Open, процесс, который создает эти матрицы, даже не использует много памяти. Taskman сообщает в использовании 2K.
Использование Eigen 2.0.15 Стабильный выпуск
Решение 2
Все ответы здесь полезны!
Оказывается, что при компиляции как 32-битный приложение, собственное исправление, если вы попытаетесь объявить густой matrixxd, как я, больше 14000 элементов или около того. Авария происходит с _aligned_malloc
Возвращая 0 в коде ALLOC EIGEN (MATRIXXD :: RESIZE ()), что означает 1,5 ГБ смежных, выровненных оперативной памяти не может быть выделен под 32-битным, что имеет смысл, поскольку это приближается к половине максимальной адресуемой памяти Отказ Найти более 1,5 ГБ, смежные из 4.0, становится действительно маловероятным, я полагаю! Обновление на EIGEN 3.0 К сожалению не решать проблему.
Решение № 1
Хорошо, так что я составлен в 64-битном и на моем 6 ГБ машины, программа успешно работает, с плотным распределением MATRIXXD и решением, работающим просто отличным.
Решение № 2.
Другое решение использует DynamicSparseMatrix<double>
. Отказ Резет не сражается на огромных размерах ALLOC, даже в качестве 32-битного приложения, но поддержка API для решения - это другая история (API, похоже, хочет преобразовать в тип Matrixxd, чтобы решить, что оставляет нас с той же оригинальной проблемой.)
Другие советы
Собственный разработчик здесь. Вы бы намного лучше спрашивали собственные вопросы на наших каналах поддержки, например, форум ... ;-)
Краткий ответ: вы используете фиксированные или динамические матрицы?
Если фиксированный размер, переключитесь на динамический размер (для таких огромных размеров, в любом случае, это немаловой)
Если вы получаете ошибку с помощью матриц динамического размера, я удивлен, но в то же время я вижу, где происходит значение 10000. В любом случае, если вы обновитесь на EIGEN3 (филиал развития), ваша проблема будет исчезнет.
Из собственного доктора:
Плотные против редки: этот матричный класс обрабатывает густые, не редкие матрицы и векторы. Для редких матриц и векторов см. Раздельный модуль.
Густые матрицы и векторы являются обычными массивами коэффициентов. Все коэффициенты хранятся в обычном смежном массиве. Это в отличие от редких матриц и векторов, где коэффициенты хранятся в виде списка ненулевых коэффициентов.
Давайте посмотрим, 10000x10000x8 (двойная матрица) составляет около 1,5 ГБ. Это о максимальном размере блока непрерывного кучи под 32-битной ОС, можно ожидать. Попробуйте редкие матрицы.
Если вам действительно нужны такие большие густые матрицы, то у вас есть совсем другие проблемы: будет ли окончание расчета до следующего отключения питания?
Учитывая спецификации вашей жесткости, которую я могу предположить, что вы работаете на 64-битной ОС.
Вы все еще можете сбой, даже если память выступает в файл страницы. Это может означать, что память фрагментирована, или что ваш файл страницы все еще слишком маленький. Если это так, вы должны поднять файл страницы к чему-то довольно большому, как 8 или 12 ГБ или около того.