Размер матрицы EIGEN MAX для 32 битных приложений

StackOverflow https://stackoverflow.com/questions/3449434

  •  27-09-2019
  •  | 
  •  

Вопрос

Итак, я нахожу Натуральный Пакет падает, когда я пытаюсь объявить матрицу больше 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 ГБ или около того.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top