2013-11-04 18 views
5

Im Zusammenhang mit einem Finite-Element-Problem habe ich eine spärliche 12800x12800-Matrix. Ich versuche, das lineare System zu lösen, indem ich einfach MATLABs \ Operator verwende, um zu lösen, und ich bekomme einen Mangel des Arbeitsspeichers mit mldivide. Ich frage mich also, ob es eine Möglichkeit gibt, dies zu beschleunigen.MATLAB spärliche Matrixlöser? Speicherfehler

Ich meine, wird etwas wie LU-Faktorisierung tatsächlich hier helfen, in Bezug auf die Speicherfehler nicht mehr zu bekommen? Ich habe die Größe des Heapspeichers auf 256 GB in den Voreinstellungen erhöht. Dies ist der Höchstwert, den ich erreichen kann, und ich erhalte immer noch den Fehler wegen zu wenig Arbeitsspeicher.

Auch nur eine allgemeine Frage. Ich habe jetzt 8 GB RAM auf meinem Laptop. Wird ein Upgrade auf 16GB überhaupt helfen? Oder kann ich etwas tun, um MATLAB mehr Speicher zuzuweisen? Ich bin mit diesem Zeug nicht vertraut.

enter image description here

+2

Einmal erreichte ich den Höhepunkt bei Matlabs Implementierung von 'mldivide'. Es ist ein hoch optimierter Code: unter Berücksichtigung des Typs und der Seltenheit der Eingaben. Ich denke nicht, dass es wahrscheinlich ist, dass Sie etwas besseres finden können, wenn Sie es nicht speziell auf Ihre spezifische Konfiguration abstimmen. – Shai

+0

Können Sie ein Diagramm des Sparsity-Musters posten? (Erstellen mit 'Spion (A)') –

+0

@RodyOldenhuis getan. – user1799323

Antwort

0

Nach this und this Sie haben einige Optionen, die in Matlab von Speicher Problem zu vermeiden:

  • Erhöhung des virtuellen Speichers des Betriebssystems
  • höhere Priorität einräumen MATLAB Prozess im Task-Manager
  • Verwenden Sie die 64-Bit-Version von MATLAB

Vor ein paar Monaten arbeitete ich an Integer-Programmierung in Matlab. Ich hatte Probleme mit dem "out of memory", also habe ich sparse Matrizen benutzt und die erwähnten Tipps befolgt, schließlich ist das Problem gelöst!

0

Sind Sie bei der Verwendung von mldivide gesperrt? Klingt wie die perfekte Situation für eine iterative Methode - bicg, gmres etc?

0

Während Backslash die geringe Anzahl von A nutzt, erzeugt die verwendete qr-Methode vollständige Matrizen, die (number_accupied_elements)^3 Speicher benötigen. Ein paar Dinge, die Sie versuchen können,

  1. Wenn Sie dünn besetzte Matrizen mit einigen Diagonalen sind teilen, können Sie versuchen, versuchen, das System mit vorwärts/rückwärts
  2. Substitution zu lösen
  3. Versuchen Sie das Problem in ein Bruch kleiner Sie brechen Das Problem in eine kleinere
  4. Run whos, um zu sehen, welche Elemente Ihren Speicher belegen, bevor Sie die Matrix-Division starten, kann einer dieser zuvor gelöscht werden?
  5. Nicht anwendbar für Ihr Problem, wie Sie es hier angegeben haben, aber wenn Ihr System definiert ist (A hat mehr Zeilen als Spalten) als mit dem pseudo-inverser (A.'*A)\(A.'*b) erzeugt ein Ergebnis mit den kleineren Spalten dimensionieren

Wie zum Hinzufügen von zusätzlichen Speicher; Matlab32 verwendet 2^32 Bytes Speicher (4 Gb), so dass die Erhöhung des physischen RAM auf Ihrem Computer nicht hilft, es sei denn, Sie verwenden die 64-Bit-Version.

0

MATLAB \ versucht normalerweise mehrere Methoden, um ein Problem zu lösen. Erstens, wenn es sieht, dass, wenn die Struktur Ihrer Matrix symmetrisch ist, versucht es eine Cholesky-Faktorisierung. Nach mehreren Schritten, wenn es keine passende Antwort finden kann, verwendet die aktuelle Version von Matlab UMFPACK Suitsparse Paket.

UMFPack ist eine spezifische LU-Implementierung, und es ist für seine Geschwindigkeit und gute Verwendung von Speicher in der Praxis bekannt.Es versucht auch, das Fill-In zu reduzieren und die Matrix so spärlich wie möglich zu halten. Deshalb verwendet MATLAB diesen Code. (Ich arbeite an UMFPACK für meine Doktorarbeit unter der Aufsicht von Dr. Tim Davis, seinem Schöpfer)

Daher wird die Verwendung einer anderen LU-Faktorisierung nicht helfen. Es ist bereits eine LU-Faktorisierung. Einer der einfachsten Wege, um Ihr Problem zu lösen, ist das Testen Ihres Problems auf einem anderen Gerät mit einem besseren Speicher, um zu sehen, ob es funktioniert.

Ich vermute, Matlab machen einige Müllsammlung und verschwenden etwas Speicher, also wenn Sie das UMFPACK direkt verwenden, könnte es Ihnen helfen. Sie können es entweder in C/C++ implementieren oder dafür die MATLAB-Schnittstelle verwenden. Sehen Sie sich das SuitSparse-Paket an.

Basierend auf der Struktur Ihrer Matrix denke ich, MATLAB versucht, Cholesky zu verwenden; Ich weiß nicht, was die Strategie von MATLAB ist, wenn Cholesky bei der Speicherverwaltung versagt. Berücksichtigen Sie, dass Cholesky in Bezug auf das Gedächtnis einfacher zu verwalten ist.

Es gibt andere Pakete, die Ihnen auch helfen können. CSparse ist ein leichtes Paket und es könnte helfen. Es gibt andere bekannte Pakete, die hilfreich sein könnten; Suche nach SuperLU.