2016-05-30 8 views
0

Ich habe ein Problem mit Linesolve in ilnumerics. Hier sind die Code:Exception System.OutOfMemoryException wurde ausgelöst.in linsolve ilnumerics

A = A_damped; // (6691x3000) array 
D = d_damped; // array size 6691 

ILArray<double> AA = A; // AA matrix (3000x6691) so should be transposed 
AA = AA.T; 
ILArray<double> BB = D; // matrix (6691 x 1) 
ILArray<double> CC = ILMath.linsolve(AA, BB); 

und ich habe folgende Meldungen:

Exception of type 'System.OutOfMemoryException' was thrown. 

ist hier jemand hat eine Ahnung?

+1

Erhalten Sie diesen Fehler zuverlässig, oder tritt er nur gelegentlich auf? Haben Sie überprüft, wie viel Speicher Ihre Anwendung verwendet? Laufen Sie 32-Bit oder 64-Bit? Haben Sie 'gcAllowVeryLargeObjects' (https://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx) angegeben? – Luaan

Antwort

0

Neben den Vorschlägen von @Luaan stellen Sie sicher, dass Ihre Problemgröße in einem vernünftigen Bereich liegt. Ihre Matrix verbraucht ~ 153 MB. Linsolve benötigt auch einige temporäre Speicher. Für temporäre Arrays während allgemeiner Berechnungen wird mehr benötigt. Als sehr grobe Faustregel sollte Ihre Problemgröße nicht mehr als 1 Drittel des für Ihre Anwendung verfügbaren RAM überschreiten. Dies ist schwer zuverlässig zu bestimmen, da immer andere Prozesse auf dem System ausgeführt werden, die auch Speicher verbrauchen ...

  • Die erste Sache, wenn Sie auf OOM-Probleme stoßen, ist 64-Bit-Ziel.
  • Verwenden Sie unbedingt the latest version von ILNumerics. Ab heute ist dies 4.10.
  • Wenn die OOMs nicht zuverlässig entfernt werden, müssen Sie die Problemgröße verringern oder stattdessen den verteilten Speicher verwenden.
+0

Danke Haymo und Luaan, es löst mein Problem. Ich laufe die Anwendung in 64 Bit, und dann überprüfte ich die Konfiguration des Projekts, ich ändere alle Zielplattform zu jedem CPU statt 86x (zuvor). – Cas

+0

Warum AnyCPU? Wenn Sie sicherstellen möchten, dass es in 64 Bit ausgeführt wird, sollten Sie x64 explizit ausrichten. Übrigens, die Art, auf SO "Danke" zu sagen, ist zu antworten und zu markieren. –

+0

Ich muss die Anwendung in anderen PC (manchmal in 32bit) testen, so brauche ich die Anwendung in anderen PC reibungslos laufen. Es tut mir leid, dass ich nicht genug Reputation habe, um deine Antwort zu verbessern. :) Danke nochmal für deinen Vorschlag. – Cas