Question

Alors, je trouve le plantage du paquet Eigen lorsque je tente déclarer une matrice plus grande que 10000x10000. Je dois déclarer une matrice comme celui-ci .. au sujet 13000x13000 éléments de manière fiable. J'ai couru un test comme:

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

tombe en panne sur ma machine (6 GB RAM) à 14008 éléments.

Je suis un peu déçu! Je pensais que Eigen était comme Matlab ou octave et ne doit pas se bloquer à l'aide des tableaux plus grands, même si elle ne touche le disque ou quelque chose ..

Et en plus est quand je lance ce test et de garder TaskMan ouvert, le processus qui crée ces matrices n'utilise même pas que beaucoup de mémoire. rapports taskman sous utilisation 2k.

Utilisation Eigen 2.0.15 version stable

Était-ce utile?

La solution 2

Toutes les réponses ici sont utiles!

Il se trouve que lorsque compilé comme 32 bits application, Eigen se bloque si vous essayez de déclarer une dense MatrixXd , comme je l'étais, plus grande que les éléments 14000 environ. L'accident se produit avec _aligned_malloc retour 0 dans la Eigen code alloc (MatrixXd :: resize ()), ce qui signifie 1.5GB de contigus, RAM alignés ne pouvait être attribué en 32 bits, ce qui est logique, puisque cela se rapproche de la moitié de la mémoire adressable maximale loc. Trouver plus de 1,5 Go sur contigue de 4,0 devient vraiment peu probable, je suppose! Mise à niveau vers Eigen 3.0 malheureusement ne pas résoudre le problème.

Solution # 1

Ok, donc je compilé en 64 bits, et sur ma machine 6GB, le programme se déroule avec succès, avec la répartition dense MatrixXd et solution fonctionne très bien.

Solution # 2

Une autre solution utilise un DynamicSparseMatrix<double>. Sparse ne tombe pas en panne sur grande taille alloc, comme 32 application bits, mais le soutien de l'API pour la résolution est une autre histoire (API semble vouloir convertir le type MatrixXd de denses afin de résoudre, ce qui nous laisse avec le même problème d'origine.)

Autres conseils

développeur Eigen ici. Vous seriez bien mieux poser des questions Eigen sur nos canaux de support par exemple forum ...; -)

Réponse courte: utilisez-vous fixes ou des matrices de taille dynamique

  • si de taille fixe, passez à la taille de dynamique (pour ces tailles énormes, il est une évidence de toute façon)

  • si vous obtenez le bogue avec des matrices dynamiques de taille, je suis surpris, mais en même temps je peux voir où la valeur 10000 vient. Dans tous les cas, si vous passez à eigen3 (la branche de développement), votre problème sera parti.

Sur la doc Eigen:

Dense par rapport rares: Cette poignée de classe matrice dense, pas des matrices et des vecteurs rares. Pour les matrices creuses et vecteurs, voir le module Sparse.
matrices denses et des vecteurs sont des tableaux usuels de simples coefficients. Tous les coefficients sont stockés, dans un tableau contigu ordinaire. Ceci est différent des matrices et des vecteurs clairsemés où les coefficients sont stockés sous forme d'une liste de coefficients non nuls.

permet de voir, 10000x10000x8 (double Matrix) fait environ 1,5 Go. Cest sur la taille maximale d'un bloc de sous os continuos 32bit, on pourrait s'y attendre. Essayez rares matrices.

Si vous avez vraiment besoin de grandes matrices denses, alors vous avez tout à fait d'autres problèmes: Est-ce que la fin de calcul avant la prochaine panne de courant

Compte tenu des caractéristiques de votre disque-ware, je ne peux que supposer que vous exécutez sur un système d'exploitation 64 bits.

Vous pouvez planter encore, même si la mémoire se paginé dans le fichier de page. Cela pourrait signifier la mémoire est fragmentée, ou que votre fichier de page est encore trop petite. Si oui, vous devriez buter votre fichier de page à quelque chose d'assez grand comme 8 ou 12 Go de ou ainsi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top