使用matlab處理比較大的數(shù)據(jù)時候,我們會遇到out of memory 的情況获茬,這種情況下就需要我們優(yōu)化代碼,來節(jié)省內(nèi)存倔既。我在處理一個超大矩陣的傅里葉變換過程中锦茁,測試了不同的代碼及內(nèi)存使用情況,這里和大家分享一下叉存。
需要傅里葉變換的矩陣A[1,250200,64]
初始變量定義:
bMax=1;
NMax=250200;
SampleMax=64;
s=1;
第一中码俩,使用for循環(huán)來讀取數(shù)據(jù),使用for 循環(huán)來進行FFT變換歼捏,
v=zeros(bMax,NMax,SampleMax);
dt = timestep*dumpstep;%time between the dump frame
fid1=fopen(['Velocity1.txt'],'r');%%讀入數(shù)據(jù)
tic
for b=1:bMax;
for f=1:SampleMax;
data_v=textscan(fid1,'%f',NMax);
save (['data_v',num2str(s),'.mat'],'data_v');
v(b,1:NMax,f)=data_v{1};
end;
toc
end;
fclose(fid1);
tic
for j=1:1:NMax;
m(bMax,1,1:SampleMax)=fft(v(bMax,j,:),[],3)*dt;
v(bMax,j,1:SampleMax)=m(bMax,1,1:SampleMax);%this is the fft part
end;
toc
Memory used by MATLAB: 2408 MB (2.525e+09 bytes)
Elapsed time is 8.434202 seconds. 數(shù)據(jù)讀取時間
Elapsed time is 64.259465 seconds. 傅里葉變換時間
第二種稿存,使用for循環(huán)讀取數(shù)據(jù),使用中間變量矩陣進行FFT變換瞳秽,
v=zeros(bMax,NMax,SampleMax);
m=zeros(bMax,NMax,SampleMax);
dt = timestep*dumpstep;%time between the dump frame
fid1=fopen(['Velocity1.txt'],'r');
tic
for b=1:bMax;
for f=1:SampleMax;
data_v=textscan(fid1,'%f',NMax);
save (['data_v',num2str(s),'.mat'],'data_v');
v(b,1:NMax,f)=data_v{1};
end;
toc
end;
fclose(fid1);
tic
m(bMax,1:NMax,1:SampleMax)=fft(v(bMax,1:NMax,:),[],3)*dt;
v(bMax,1:NMax,1:SampleMax)=m(bMax,1:NMax,1:SampleMax);%this is the fft part
toc
Memory used by MATLAB: 2652 MB (2.781e+09 bytes)
Elapsed time is 8.485230 seconds.
Elapsed time is 1.290618 seconds.
FFT變換的時間變短瓣履,但是中間變量占據(jù)內(nèi)存使得總的需要的內(nèi)存變大。
對于matlab的傅里葉變換练俐,矩陣操作比for循環(huán)效率高袖迎。
第三種,使用for循環(huán)讀取數(shù)據(jù)腺晾,不使用中間變量矩陣進行FFT變換燕锥,將FFT變換之后的結(jié)果直接付給原來的矩陣。
v=zeros(bMax,NMax,SampleMax);
dt = timestep*dumpstep;%time between the dump frame
fid1=fopen(['Velocity1.txt'],'r');
tic
for b=1:bMax;
for f=1:SampleMax;
data_v=textscan(fid1,'%f',NMax);
save (['data_v',num2str(s),'.mat'],'data_v');
v(b,1:NMax,f)=data_v{1};
end;
toc
end;
fclose(fid1);
tic
v(bMax,1:NMax,1:SampleMax)=fft(v(bMax,1:NMax,:),[],3)*dt;
toc
Memory used by MATLAB: 2408 MB (2.525e+09 bytes)
Elapsed time is 8.791504 seconds.
Elapsed time is 0.892415 seconds.
發(fā)現(xiàn)這種情況下悯蝉,內(nèi)存的使用減少归形。也就是說,在matlab中鼻由,使用matlab內(nèi)置的函數(shù)對一個矩陣進行操作時暇榴,并且把操作的結(jié)果返回給原來的矩陣厚棵,根據(jù)第一種和第三種使用的內(nèi)存一樣,可以看出這種操作的流程如下:
對矩陣A中的某一維進行操作蔼紧,計算出結(jié)果婆硬,將結(jié)果返回A中的這一維,接著對A中的另外一維進行操作奸例,依次進行下去彬犯,而不是對A中的全部維進行操作,存在臨時變量中哩至,再將所有的結(jié)果統(tǒng)一賦值給矩陣A躏嚎。
同時我也測試了for循環(huán)讀取數(shù)據(jù)和直接load 的速度蜜自,for 循環(huán)讀取數(shù)據(jù)的速度高于load菩貌。