Pregunta

Por lo tanto, yo estoy encontrando las Eigen accidentes paquete cuando intento para declarar una matriz más grande que 10000x10000. Necesito declarar una matriz como esta .. 13000x13000 sobre los elementos de forma fiable. Corrí una prueba como:

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

Se bloquea en mi máquina (6 GB de RAM) a 14008 elementos.

Estoy un poco decepcionado! Pensé Eigen era como MATLAB o de octava y no debe bloquearse utilizando matrices más grandes, incluso si no golpeó el disco o algo ..

Y lo que es más es cuando corro esta prueba y mantener TaskMan abierto, el proceso que se está creando estas matrices no incluso utilizar esta cantidad de memoria. informes TaskMan bajo 2k uso.

Uso Eigen 2.0.15 versión estable

¿Fue útil?

Solución 2

Todas las respuestas aquí son útiles!

Resulta que cuando se compila como 32 bits aplicación, Eigen se bloqueará si intenta declarar un densa MatrixXd , como yo, más grande que 14000 elementos más o menos. El accidente ocurre con _aligned_malloc devolviendo un 0 en el código alloc Eigen (MatrixXd :: cambio de tamaño ()), es decir, 1,5 GB de contiguos, alineado RAM no se pudo asignar de 32 bits, lo cual tiene sentido, ya que se está acercando a la mitad del máximo loc memoria direccionable. Encontrar a más de 1,5 GB a cabo contigua de 4.0 llega a ser realmente difícil, supongo! La actualización a 3.0 por desgracia Eigen no se soluciona el problema.

Solución # 1

Ok entonces, por lo que he recopilado en 64 bits, y en mi máquina de 6 GB, el programa se ejecuta con éxito, con la densa asignación y la solución MatrixXd funcionando muy bien.

Solución # 2

Otra solución es utilizar un DynamicSparseMatrix<double>. Escaso no se bloquea en gran alloc tamaño, así como aplicación de 32 bits, pero el soporte de API para la solución es otra historia (API parece querer convertir a MatrixXd tipo densa con el fin de resolver, lo que nos deja con el mismo problema original.)

Otros consejos

Eigen desarrollador aquí. Usted sería mucho mejor haciendo preguntas Eigen en nuestros canales de soporte, por ejemplo, foro ...; -)

Breve respuesta: ¿Está utilizando fijo o matrices de tamaño dinámico

  • Si de tamaño fijo, cambie a dinámica de tamaño (para tales tamaños enormes, es una obviedad de todos modos)

  • Si usted está recibiendo el error con matrices de tamaño dinámico, estoy sorprendido, pero al mismo tiempo puede ver donde el valor 10000 viene. En cualquier caso, si se actualiza a eigen3 (la rama de desarrollo), el problema se habrá ido.

Fuera de la doc Eigen:

Densa en comparación con escasa: Esta Matriz asas clase densa, no matrices y vectores dispersos. Para las matrices y vectores dispersos, vea el módulo escasa.
matrices y vectores densos son matrices habituales de fricción de coeficientes. Todos los coeficientes se almacenan, en una matriz contigua ordinario. Esto es a diferencia de matrices dispersas y vectores donde los coeficientes se almacenan como una lista de coeficientes distintos de cero.

Vamos a ver, 10000x10000x8 (doble Matrix) hace alrededor de 1,5 GB. Eso es aproximadamente el tamaño máximo de bloque del montón un continuo bajo un sistema operativo de 32 bits, sería de esperar. Trate de matrices dispersas.

Si realmente necesita tan grandes matrices densas, entonces usted tiene bastante algunos otros problemas:? Se acabará el cálculo antes del siguiente corte de energía

Teniendo en cuenta las especificaciones de su disco-ware Sólo puedo suponer que se está ejecutando en un sistema operativo de 64 bits.

Usted todavía puede fallar incluso si la memoria se copia en disco en el archivo de paginación. Podría significar la memoria está fragmentada, o que su archivo de página es todavía demasiado pequeña. Si es así, usted debe subir el archivo de paginación a algo bastante grande como 8 o 12 GB de más o menos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top