2013-07-02 2 views
3

В моем случае (64-битная ubuntu с 16-гигабайтной памятью, используя Eigen3), я пишу MatrixXd m (M, M); где М = 100000, при запуске, программа разбился, и сообщил:Каков максимальный размер матрицы в Eigen?

, что(): станд :: bad_alloc
Прерванный (ядро сбрасывали)

Использование динамического 2 тусклый массив, то программа работает нормально. Существует ли жесткий предел размера (плотной) матрицы в Eigen?

ответ

6

Вы пытаетесь выделить 100000*100000 элементов по 8 байт каждый или 80 000 000 000 байт (74,5 ГБ), что не работает, поскольку у вас только 16 ГБ памяти. Это приводит к сбою в распределении памяти, поскольку он не может найти ни одного непрерывного блока памяти, который является большим.

В Eigen нет фиксированного предела, но массив необходимо выделять в вашей системе.

+0

спасибо, в 2-х случаях массива, я забыл, что C++ не будет выделять реальное пространство до тех пор, пока программа не получит доступ к нему, поэтому я полагал, что память все еще достаточно велика для матрицы. – chentingpc

1

YOu забыл о размере элемента матрицы.

MatrixXd использует двойные

100000 * 100000 = 10000000000 элементы.

sizeof (double), вероятно, 8 в вашей системе.

Это означает, что для того, чтобы создать эту матрицу, вам необходимо:

ширина * высота * SizeOf (двойной) => * 100000 100000 * 8/(1024 * 1024 * 1024) => 74,5 гигабайт памяти.

+0

спасибо, в случаях 2d массивов, я забыл, что C++ не будет выделять реальное пространство до тех пор, пока программа не получит доступ к нему, поэтому я предположил, что память все еще достаточно велика для матрицы. – chentingpc