WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Out of memory

 

philfisc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2014, 21:42     Titel: Out of memory
  Antworten mit Zitat      
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
   
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 Smile

Beste Grüße


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.03.2014, 22:39     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich ausrechne, wie groß M im Speicher ist, komme ich auf

Code:
>> 500*493*493*8

ans =

   972196000


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
Private Nachricht senden Benutzer-Profile anzeigen
 
philfisc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2014, 23:01     Titel:
  Antworten mit Zitat      
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?

Danke!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 00:02     Titel:
  Antworten mit Zitat      
Hallo,

erster Vorschlag:
Code:
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

Wie gesagt, Vektorisierung wäre noch hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 10:19     Titel:
  Antworten mit Zitat      
Was meinst du genau mit Vektorisierung?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 16:02     Titel:
  Antworten mit Zitat      
Hallo,

Vektorisierung bedeutet, for-Schleifen zugunsten direkter Operationen auf Matrizen/Vektoren zu eliminieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
philfisc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 16:48     Titel:
  Antworten mit Zitat      
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!

Vielen Dank und viele Grüße
PHilfisc
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 16:58     Titel:
  Antworten mit Zitat      
Hallo,

hier erstmal mehr Informationen zur Vektorisierung:
http://www.mathworks.de/de/help/mat.....b_prog/vectorization.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
philfisc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 18:10     Titel:
  Antworten mit Zitat      
Danke für den Link! Leider komm ich grad echt nicht mehr weiter und bin hier am verzweifeln..
Kannst du mir nicht doch beispielhaft zeigen?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 18:52     Titel:
  Antworten mit Zitat      
Hallo,

Code:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
philfisc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 19:14     Titel:
  Antworten mit Zitat      
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...
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 20:14     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
philfisc

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 22:27     Titel:
  Antworten mit Zitat      
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?

Danke!
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.03.2014, 23:45     Titel:
  Antworten mit Zitat      
Hallo,

mehr Speicher in einem Rechner sollte klar sein.
Paralleles Rechnen auf einem Cluster:
http://www.mathworks.de/products/distriben/
Arbeiten mit Distributed Arrays:
http://www.mathworks.de/de/help/dis.....ute-arrays.html#br9_n8y-1

Zitat:
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.