Pergunta

Então, estou encontrando o Eigen O pacote falha quando tento declarar uma matriz maior que 10000x10000. Preciso declarar uma matriz como essa .. cerca de 13000x13000 elementos de maneira confiável. Eu fiz um teste como:

for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ )
{
  printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ;
  Eigen::MatrixXd m( tortureEigen, tortureEigen ) ;
}

Trava na minha máquina (6 GB de RAM) em 14008 elementos.

Estou meio decepcionado! Eu pensei que Eigen era como Matlab ou oitava e não deveria travar usando matrizes maiores, mesmo que atinja o disco ou algo assim ..

E o que é mais é quando eu executo esse teste e mantenho o Taskman aberto, o processo que está criando essas matrizes nem sequer usa tanta memória. Taskman relata sob uso de 2K.

Usando a liberação estável do Eigen 2.0.15

Foi útil?

Solução 2

Todas as respostas aqui são úteis!

Acontece que Quando compilado como um 32 bits App, Eigen falhará se você tentar declarar um Matrixxd denso, como eu era, maiores que 14000 elementos ou mais. O acidente acontece com _aligned_malloc Retornando 0 no código Alloc Eigen (matrixxd :: redize ()), significando 1,5 GB de RAM alinhada e contígua não pôde ser alocada em 32 bits, o que faz sentido, já que isso está chegando perto da metade da memória endereçável máxima localiz . Encontrar mais de 1,5 GB de contíguo de 4.0 se torna realmente improvável, suponho! Atualizando para Eigen 3.0 Infelizmente não resolva o problema.

Solução #1

Ok, então, então eu compilei em 64 bits e na minha máquina de 6 GB, o programa funciona com sucesso, com a densa alocação e solução de Matrixxd funcionando muito bem.

Solução #2

Outra solução é usar um DynamicSparseMatrix<double>. O Sparse não trava o tamanho enorme, mesmo como aplicativo de 32 bits, mas o suporte da API para a solução é outra história (a API parece querer se converter para o tipo denso Matrixxd para resolver, o que nos deixa com o mesmo problema original.)

Outras dicas

Desenvolvedor Eigen aqui. Você seria muito melhor fazendo perguntas de Eigen em nossos canais de suporte, por exemplo, fórum ... ;-)

Resposta curta: Você está usando matrizes fixas ou de tamanho dinâmico?

  • Se fixo, mude para o tamanho dinâmico (para tamanhos tão enormes, é um acéfalo de qualquer maneira)

  • Se você está recebendo o bug com matrizes de tamanho dinâmico, fico surpreso, mas ao mesmo tempo posso ver de onde vem o valor 10000. De qualquer forma, se você atualizar para o eigen3 (o ramo de desenvolvimento), seu problema desaparecerá.

Fora do Doc Eigen:

Denso versus esparso: esta classe matriz lida com matrizes e vetores densos, não esparsos. Para matrizes e vetores esparsos, consulte o módulo esparso.
Matrizes e vetores densos são matrizes habituais simples de coeficientes. Todos os coeficientes são armazenados, em uma matriz contígua comum. Isso é diferente de matrizes e vetores esparsos, onde os coeficientes são armazenados como uma lista de coeficientes diferentes de zero.

Vamos ver, 10000x10000x8 (matriz dupla) produz cerca de 1,5 GB. Isso é sobre o tamanho máximo de um bloco de heap Continuos sob um sistema operacional de 32 bits, seria de esperar. Experimente matrizes esparsas.

Se você realmente precisa de matrizes densas tão grandes, terá alguns outros problemas: o cálculo terminará antes da próxima queda de energia?

Dadas as especificações do seu softia duro, só posso assumir que você está executando um sistema operacional de 64 bits.

Você ainda pode travar, mesmo que a memória seja paginada no arquivo da página. Isso pode significar que a memória é fragmentada ou que seu arquivo de página ainda é muito pequeno. Nesse caso, você deve aumentar seu arquivo de página para algo muito grande como 8 ou 12 GBs.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top