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

Code zu ineffizient - Out of Memory Error

 

quantfinance
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 23.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2010, 12:52     Titel: Code zu ineffizient - Out of Memory Error
  Antworten mit Zitat      
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.

ita=[ger1,ger2,ger3,ger4,ger5,ger6,gb1,gb2,gb3,gb4,gb5,gb6,gb7,gb8,gb9,fra1,fra2,fra3,fra4,ita1,ita2];

%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];
 
clear germv1 germv2 germv3 germv4 germv5 germv6 gbmv1 gbmv2 gbmv3 gbmv4 gbmv5 gbmv6 gbmv7 gbmv8 gbmv9 framv1 framv2 framv3 framv4 itamv1 itamv2
N=size(ita,1); % Anzahl Zeilen
M=size(ita,2); % Anzahl Spalten
 
% Monthly returns berechnen
for i=1:21:N-21
    Returns(i+21,:)=log(ita(i+21,:))-log(ita(i,:));
end
 
%Statistics for Italian equal weighted market portfolio
meanstocks=nanmean(Returns,2);
meanstocks(meanstocks==0)=NaN;
nanmean(meanstocks)*100
nanmedian(meanstocks)
nanstd(meanstocks)
nanmin(meanstocks)
nanmax(meanstocks)
skewness(meanstocks)
kurtosis(meanstocks)
 
% Value-weighted market returns
ita2=Returns;
itamv2=itamv;
ita2(isnan(ita2))=0;
itamv2(isnan(itamv2))=0;
mvges=nansum(itamv2,2);

%Calculate market weights
for i=1:N
    for j=1:M
        relmv(i,j)=itamv2(i,j)/mvges(i);
    end
end

%equalize sizes of relmv and ita2
diff=size(relmv)-size(ita2);
for i=1:diff
    relmv(i,:)=[];
end
relaux=relmv.*ita2;
retmv=nansum(relaux,2);
 
retmv(retmv==0)=NaN; %change zeros in retmv to NaN; then we can use the nanmean etc
nanmean(retmv)*100
nanmedian(retmv)
nanstd(retmv)
nanmin(retmv)
nanmax(retmv)
skewness(retmv)
kurtosis(retmv)
 
% Daily Returns
for i=1:N-1
    Returns2(i+1,:)=log(ita(i+1,:))-log(ita(i,:));
end
 
auxita=Returns2;
auxitamv=itamv;
auxita(isnan(auxita))=0;
auxitamv(isnan(auxitamv))=0;
mvges2=nansum(auxitamv,2);
 
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);
 
% Risk Measure (value weighted market returns)
rpdvw=retmv2.^2;
rrpdvw=retmv2(2:N-1).*retmv2(1:(N-2));
 
for i=15:21:N-23
    vptvw(i)=nansum(rpdvw(i:(i+21)))+2*nansum(rrpdvw((i+1):(i+21)));
end
 
vptvw(vptvw==0)=NaN; %change zeros in retmv to NaN; then we can use the nanmean etc
vptvw(vptvw<=0)=NaN;
nanmean(vptvw)*100
nanmedian(vptvw)
nanstd(vptvw)
nanmin(vptvw)
nanmax(vptvw)
skewness(vptvw)
kurtosis(vptvw)
 
nanmean(sqrt(vptvw))*100
nanmedian(sqrt(vptvw))
nanstd(sqrt(vptvw))
nanmin(sqrt(vptvw))
nanmax(sqrt(vptvw))
skewness(sqrt(vptvw))
kurtosis(sqrt(vptvw))
 
% Equal-weighted Risk Measure
meanstocks2=nanmean(Returns2,2);
rpd=meanstocks2.^2;
rrpd=meanstocks2(2:N-1).*meanstocks2(1:(N-2));
for i=15:21:N-23
    vpt(i)=nansum(rpd(i:(i+21)))+2*nansum(rrpd((i+1):(i+21)));
end
 
vpt(vpt==0)=NaN; %change zeros in retmv to NaN; then we can use the nanmean etc
vpt(vpt<=0)=NaN;
nanmean(vpt)*100
nanmedian(vpt)
nanstd(vpt)
nanmin(vpt)
nanmax(vpt)
skewness(vpt)
kurtosis(vpt)
 
nanmean(sqrt(vpt))*100
nanmedian(sqrt(vpt))
nanstd(sqrt(vpt))
nanmin(sqrt(vpt))
nanmax(sqrt(vpt))
skewness(sqrt(vpt))
kurtosis(sqrt(vpt))

clear vpt
 
%Measure of aggregate stock risk.
M=size(ita,2); % Number of columns
rp=Returns2.^2;
rrp=Returns2(2:N,:).*Returns2(1:(N-1),:);  
 
for i=1:M
    for j=1:21:N-21
    vp(j+21,i)=nansum(rp((j+1):(j+21),i))+2*nansum(rrp((j+1):(j+20),i));
    end
end
 
vp(vp==Inf)=NaN;
vp(vp==0)=NaN;
vp(vp<=0)=NaN;
vt=nanmean(vp,2);
nanmean(vt)
nanmedian(vt)
nanstd(vt)
nanmin(vt)
nanmax(vt)
skewness(vt)
kurtosis(vt)
 
nanmean(sqrt(vt))
nanmedian(sqrt(vt))
nanstd(sqrt(vt))
nanmin(sqrt(vt))
nanmax(sqrt(vt))
skewness(sqrt(vt))
kurtosis(sqrt(vt))
 
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.07.2010, 16:49     Titel: Re: Code zu ineffizient - Out of Memory Error
  Antworten mit Zitat      
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:
Code:
relmv = bsxfun(@rdivide, itamv2, mvges)


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
quantfinance
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 23.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2010, 17:53     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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
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.