Verfasst am: 17.07.2010, 12:52
Titel: Code zu ineffizient - Out of Memory Error
Hallo,
ich habe einen recht großen Datensatz. Für einzelne Teile dieses Datensatzes funktioniert mein Code. Allerdings ist er leider zu ineffizient als dass ich ihn für alle Daten gemeinsam verwenden könnte. Ich bekomme schon zu Beginn Out of Memory-Fehler. Es könnte an dem Windows-Vista mit 32bit liegen. Die Variablen, die nicht mehr benötigt werden, versuche ich ständig zu löschen. Allerdings gibt es einen Punkt, an dem ich keine zusätzlichen Variablen löschen kann.
Ich poste hier meinen Code, weil ich weiß, dass er sicher höchst ineffizient ist. Ich bin allen dankbar, die mir wertvolle und verständliche Hinweise geben können, wie ich meinen Code effizienter gestalten kann, so dass ich dann auch das Memory-Problem lösen kann. Vielen Dank bereits im Voraus für alle Hinweise!
Code:
clear
%Die Matrizen ita und itamv haben beide die Dimension 7830x4560.
%Ich lösche zwischendurch stets Variablen, um nicht sofort das Problem von zu wenig memory zu bekommen.
clear ger1 ger2 ger3 ger4 ger5 ger6 gb1 gb2 gb3 gb4 gb5 gb6 gb7 gb8 gb9 fra1 fra2 fra3 fra4 ita1 ita2
itamv=[germv1,germv2,germv3,germv4,germv5,germv6,gbmv1,gbmv2,gbmv3,gbmv4,gbmv5,gbmv6,gbmv7,gbmv8,gbmv9,framv1,framv2,framv3,framv4,itamv1,itamv2];
for i=1:N
for j=1:M
relmv2(i,j)=auxitamv(i,j)/mvges2(i);
end end
diff2=size(relmv,1)-size(ita2,1);
for i=1:diff2
relmv2(i,:)=[];
end
relaux2=relmv2.*auxita;
retmv2=nansum(relaux2,2);
Verfasst am: 17.07.2010, 16:49
Titel: Re: Code zu ineffizient - Out of Memory Error
Hallo quantfinance,
das Lesen Deiner Nachricht ist anstrengend mit meinem Firefox-Browser, weil ich horizontal scrollen muss um alles zu lesen. Treten mit anderen Browsern die gleichen Probleme auf?
Code:
for i=1:21:N-21
Returns(i+21,:)=log(ita(i+21,:))-log(ita(i,:));
end
Dieses Muster tritt mejrfach in Deinem Code auf. Die Variable "Returns" wird nicht corher allociert, so dass in jedem Aufruf neuer Speicherplatz reserviert wird. Einerseits ist das grausam langsam, andererseits zerstückelt es auch den verwendbaren Speicherplatz und die OutOfMemory Fehler werden immer wahrscheinlicher.
Hier z.B.:
Code:
for i=1:N
for j=1:M
relmv(i,j)=itamv2(i,j)/mvges(i);
end end
Wenn man vor der Schleife "relmv = zeros(N, M);" nutzt um den Speicher für relmv zu reservieren, ist das Programm viel effizienter.
Nebenbei könnte BSXFUN die Schleifen aber auch ersetzen:
Ich möchte das Thema noch einmal pushen.
Ich möchte mich in Matlab gern weiterentwickeln, wobei ich festgestellt habe, dass Hinweise und Feeback extrem wichtig sind.
@Jan: Danke schon mal, ich versuche das auf der Stelle zu implementieren.
wenn ich das richtig sehe, arbeitest du mit 2 sehr großen Matrizen, aber voneinander unabhängig. Vorschlag: erst die erste Matrix erstellen und damit arbeiten, sie dann löschen und mit der zweiten Matrix arbeiten.
Zudem könnte man versuchen, von double auf single zu gehen.
Im übrigen die Vorschläge von Jans umsetzen.
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.