Frage

Also, ich bin die Suche nach dem Eigen Paket stürzt ab, wenn ich versuche, eine Matrix, die größer als 10000x10000 zu erklären. Ich brauche eine Matrix so zu erklären .. über 13000x13000 Elemente zuverlässig. Ich lief ein Test wie:

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

Abstürze auf meinem Rechner (6 GB RAM) bei 14.008 Elementen.

Ich bin ein bisschen enttäuscht! Ich dachte, Eigen war wie MATLAB oder Oktave und sollte nicht abstürzen größere Arrays verwenden, auch wenn es die Festplatte oder etwas anstößt ..

Und was mehr ist, als ich diesen Test laufen und TaskMan offen zu halten, wird der Prozess, der diese Matrizen schafft verwendet nicht einmal so viel Speicher. TaskMan Berichte unter 2k Nutzung.

Mit Eigen 2.0.15 Stable-Release

War es hilfreich?

Lösung 2

Alle Antworten hier sind hilfreich!

Es stellt sich heraus, dass , wenn kompiliert als 32-Bit App, Eigen stürzt ab, wenn Sie versuchen, und deklarieren Sie eine dicht MatrixXd , wie ich war, größer als 14000 Elemente oder so. Der Absturz passiert mit _aligned_malloc Rückkehr 0 in der Eigen alloc Code (MatrixXd :: resize ()), was bedeutet, 1.5GB von zusammenhängenden, ausgerichtet RAM kann nicht unter 32-Bit zugeordnet werden, was Sinn macht, da dies immer in der Nähe der Hälfte der maximal adressierbaren Speicher loc. Die Suche nach mehr als 1,5 GB zusammenhängenden aus 4.0 wird wirklich unwahrscheinlich, nehme ich an! Ein Upgrade auf 3.0 Eigen leider nicht das Problem lösen.

Lösung 1

Ok dann, so dass ich in 64-Bit kompilierte und auf meiner 6GB Maschine, das Programm läuft erfolgreich, mit der dichten MatrixXd Zuteilung und Lösung ganz gut arbeiten.

Lösung 2

Eine andere Lösung wird mit einem DynamicSparseMatrix<double>. Sparse nicht auf enorme Größe alloc nicht abstürzen, auch als 32-Bit-Anwendung, aber API-Unterstützung für die Lösung ist eine andere Geschichte (API scheint MatrixXd dichten Typ konvertieren, um zu wollen, zu lösen, die Blätter uns mit dem gleichen ursprünglichen Problem.)

Andere Tipps

EIGEN Entwickler hier. Sie würden weit besser dran Eigen Fragen auf unsere Support-Kanäle fragen z.B. Forum ...; -)

Kurze Antwort: Verwenden Sie feste oder dynamische Größe Matrizen

  • , wenn feste Größe, Umstellung auf dynamische Größe (für so große Größen, es ist ein Kinderspiel sowieso)

  • Wenn Sie den Fehler mit dynamischen großen Matrizen sind immer, ich bin überrascht, aber zugleich kann ich sehen, wo der Wert 10000 herkommt. Auf jedem Fall, wenn Sie eigen3 Upgrade (der Entwicklungszweig), wird Ihr Problem verschwunden sein.

Aus dem Eigen doc:

Dicht gegen spärlich: Diese Matrix-Klasse Griffe dicht, nicht dünn besetzte Matrizen und Vektoren. Für schwach besetzte Matrizen und Vektoren finden Sie in der Sparse-Modul.
Dichte Matrizen und Vektoren sind einfache übliche Anordnungen von Koeffizienten. Alle Koeffizienten gespeichert sind, in einer gewöhnlichen zusammenhängenden Arrays. Dies ist anders als schwach besetzte Matrizen und Vektoren, wobei die Koeffizienten als eine Liste von Nicht-Null-Koeffizienten gespeichert sind.

Mal sehen, 10000x10000x8 (Doppel-Matrix) macht etwa 1,5 GB. Das ist über die maximale Größe eines kontinuierlichen Heapblock unter einem 32-Bit-Betriebssystem würde man erwarten. Versuchen spärlich Matrices.

Wenn Sie wirklich so große, dichte Matrizes brauchen, dann hast du recht einige andere Probleme: Wird die Berechnung Ende vor dem nächsten Stromausfall

In Anbetracht der technischen Daten Ihrer Fest-ware kann ich nur annehmen, dass Sie auf einem 64-Bit-OS ausgeführt werden.

Sie können nach wie vor sogar zum Absturz bringen, wenn der Speicher in die Auslagerungsdatei ausgelagert wird. Es könnte bedeuten, Speicher fragmentiert, oder dass Ihre Seite Datei ist noch zu klein. Wenn ja, sollten Sie Ihre Auslagerungsdatei auf etwas ziemlich groß wie 8 oder 12 GB ist bump up oder so.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top