Verfasst am: 12.03.2014, 21:42
Titel: Out of memory
Hallo,
ich versuche meine ersten Schritte mit Matlab (brauche es für meine Bachelor-Arbeit) und habe schon ein paar Programme geschrieben. Das Problem bei meinem folgenden Code ist, dass die Meldung "Out of memory" angezeigt wird und ich keine Ausgabe erhalte bzw. später keinen Zugriff auf einzelne Elemente habe. Ich habe es schon mit "pack" probiert, doch es hat leider nicht geholfen.
Code:
P=SP500;
L=size(P);
for z = 1:L(2)
spalte = P(:,z);
for i = 1:L(1) for j = 1:L(1)
M(i,j,z) = spalte(i)*spalte(j);
end end
for i = 1:(L(1)-1) for j = 1:(L(1)-1)
a(i,j,z) = 1/(M(i,j,z)) * (spalte(i+1)-spalte(i)) * (spalte(j+1)-spalte(j));
end end
Die Formel stimmt so, ich habe es mit kleineren Teilen der Matrix SP500 ausprobiert und es kamen die richtigen Werte raus. Bei der Matrix SP500 handelt es sich um eine 500x493 Matrix mit Einträgen wie z.B.: 2.5784
Vielleicht kann mir ja jemand weiterhelfen wie ich mein Problem lösen könnte
also rund 970 MB, und a ist auch nochmal so groß - Speicherbedarf also knapp 2 GB allein für diese beiden Variablen. Es erstaunt mich nicht, wenn das den Speicher des ein oder anderen Rechners sprengt.
Wenn du mit so großen Datenmengen rechnest, ist Effizienz sehr wichtig:
- brauchst du wirklich M und a? Wenn nicht, solltest du a direkt berechnen, ohne M zwischenzeitlich abzuspeichern.
- for-Schleifen und mehrfache Berechnungen nach Möglichkeit vermeiden!
- wenn for-Schleifen nötig sind, den Speicher für die Matrizen vorbelegen.
Eine Frage ist natürlich auch: was willst du mit diesen Daten am Ende anfangen? Wenn damit weitere Berechnungen durchgeführt werden sollen, deren Ergebnisse am Ende weniger groß sind, dann kann man das vielleicht direkt machen, ohne die komplette Matrix je abzuspeichern.
Grüße,
Harald
philfisc
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.03.2014, 23:01
Titel:
Danke für die schnelle Antwort!
Ist es also sinnvoller M nicht zu berechnen sondern einfach unten die Formel für M einsetzen?
Wie würde das dann aussehen?
Naja ich werde später schon noch einiges mit a rechnen müssen, d.h. a komplett abzuspeichern wäre schon sinnvoll, wenn es denn geht.
Wie kann ich in meinem Fall den Speicher für die Matrizen am sinnvollsten vorbelegen?
P=SP500;
L=size(P);
a = zeros(L(1)-1, L(1)-1, L(2));
for z = 1:L(2)
spalte = P(:,z);
for i = 1:(L(1)-1) for j = 1:(L(1)-1)
a(i,j,z) = 1/(spalte(i)*spalte(j)) * (spalte(i+1)-spalte(i)) * (spalte(j+1)-spalte(j));
end end end
Vektorisierung bedeutet, for-Schleifen zugunsten direkter Operationen auf Matrizen/Vektoren zu eliminieren.
Grüße,
Harald
philfisc
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.03.2014, 16:48
Titel:
Tut mir leid wenn ich dir nicht ganz folgen kann, aber leider sind meine Kenntnisse von MAtlab momentan doch eher beschränkt und ich weiß nicht, wie ich deinen Vorschlag umsetzen kann.
Kannst du mir das vielleicht anhand meines Codes zeigen?
Wäre echt super!
P=randn(200,200);
L=size(P);
tic
a = zeros(L(1)-1, L(1)-1, L(2));
for z = 1:L(2)
spalte = P(:,z);
for i = 1:(L(1)-1) for j = 1:(L(1)-1)
a(i,j,z) = 1/(spalte(i)*spalte(j)) * (spalte(i+1)-spalte(i)) * (spalte(j+1)-spalte(j));
end end end toc tic
a2 = zeros(L(1)-1, L(1)-1, L(2));
for z = 1:L(2)
spalte = P(:,z);
for i = 1:(L(1)-1)
a2(i,:,z) = 1./(spalte(i)*spalte(1:end-1)) * (spalte(i+1)-spalte(i)) .*diff(spalte);
end end toc tic
a3 = zeros(L(1)-1, L(1)-1, L(2));
for z = 1:L(2)
spalte = P(:,z);
dspalte = diff(spalte);
a3(:,:,z) = 1./(spalte(1:end-1)*spalte(1:end-1)') .*(dspalte*dspalte');
end toc
a2 und a3 werden in vektorisierter Form berechnet. Zu meiner Überraschung ist der Geschwindigkeitsgewinn bei Vektorisierung hier nicht so groß, wie ich gedacht hätte.
Natürlich sollte man im letztlichen Code nur eine Variante behalten.
Das größte Problem dürfte aber ohnehin das Speicherproblem sein. Hast du das denn beheben können?
Grüße,
Harald
philfisc
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.03.2014, 19:14
Titel:
Danke für deine Hilfe!
Leider konnte ich bisher keine Lösung für mein Speicherproblem finden. Bin auch was das angeht so langsam am Ende mit meinem Latein.
Hatte mir auch schon überlegt, die Daten zu aufzuteilen, was aber blöd wird sobald ich weiter damit rechnen will und innerhalb der MAtrix auch Querverweise benötige...
Leider konnte ich bisher keine Lösung für mein Speicherproblem finden.
Vektorisierung bringt nur Geschwindigkeit. Wenn der Speicher ausgeht, gibt es genau zwei Möglichkeiten:
a) mehr Speicher zur Verfügung stellen (entweder in einem Rechner, oder Nutzung einees Clusters --> Paralleles Rechnen)
b) mit kleineren Daten arbeiten
Zitat:
Hatte mir auch schon überlegt, die Daten zu aufzuteilen, was aber blöd wird sobald ich weiter damit rechnen will und innerhalb der MAtrix auch Querverweise benötige...
Da kann ich dir nicht weiterhelfen, solange ich nicht weiß, wie diese Berechnungen aussehen.
Grüße,
Harald
philfisc
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.03.2014, 22:27
Titel:
Hallo,
da mit kleineren Daten rechnen keine Alternative ist, muss ich den Speicher irgendwie erweitern.
Du hast was von Erweiterung oder clustern gesprochen, wie genau geht so etwas?
da mit kleineren Daten rechnen keine Alternative ist,
Das ist eigentlich immer eine Alternative - es heißt ja nicht zwangsläufig, dass man mit weniger Daten arbeitet, sondern nur mit weniger Daten gleichzeitig.
Um dir da Rat geben zu können, müsstest du aber eben sagen, was du danach mit den Daten machen willst.
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.