代码:
我必须制作一些大小为1080*171*52*120
(经度,纬度,深度,时间)的大型netcdf文件中包含的数据图。我的策略是将数据加载到第一个中的12个块和第四个维度中的36个(参见脚本末尾)。
所以,我在12个空间块上有一个for
循环,在36个时间块上包含for
循环。在时间块的每次迭代中,我将所需的信息存储在矩阵V
中,然后绘制图。
问题:
代码的速度似乎在几次迭代后变慢。它发生的迭代不是常数...通常是5或8.减速似乎不是由于内存问题,因为在第一次迭代后分配的内存是不变的。问题似乎是由于加载了数据( via ncread
)。但是,我上传的数据大小对于所有迭代都是不变的......
下面'减速前memory
的输出以及加载文件所用的时间:
最大可能阵列:23186 MB(2.431e + 10字节)*内存 适用于所有阵列:23186 MB(2.431e + 10字节)*内存 由MATLAB使用:1226 MB(1.286e + 09字节)物理内存 (RAM):16296 MB(1.709e + 10字节)
- 受系统内存(物理+交换文件)的限制。经过的时间 0.384304 秒。
虽然在减速之后输出相同:
最大可能数组:23186 MB(2.431e + 10字节) *可用于所有阵列的内存:23186 MB(2.431e + 10字节) * MATLAB使用的内存:1226 MB(1.286e + 09字节)物理内存(RAM):16296 MB(1.709e + 10字节)
- 受系统内存(物理+交换文件)的限制。经过的时间 26.155781 秒。
进一步混淆......
每次chunk由5个时间点组成。这些时间点的索引在具有120/5个元素的单元阵列(new_inds
)的每个单元中以5乘5存储。
但是,如果我将此单元阵列的长度限制为8(或8 * 5个时间点),则代码不会减慢速度。
事实上,在最后一种情况下的加载时间在整个执行过程中实际上是不变的:
最大可能阵列:23068 MB(2.419e + 10字节)*内存 适用于所有阵列:23068 MB(2.419e + 10字节)*内存 由MATLAB使用:1231 MB(1.291e + 09字节)物理内存 (RAM):16296 MB(1.709e + 10字节)
- 受系统内存(物理+交换文件)的限制。经过的时间 0.390843 秒。
请注意,在最后一种情况下,要上传的块的大小与之前相同。所以,即使我显然希望代码整体运行得更快(因为总共有更少的时间点),我不明白为什么在最后一种情况下加载效果很好。
问题:
两种情况之间唯一的变化是包含时间索引的单元格数组的长度。但我真的怀疑这可能是放慢速度的原因......另外因为在第一种情况下,matlab在经过一定数量的迭代后变得懒惰。
有人能理解它的原因吗?
脚本:
TT=length(new_inds);%how many time steps to average at each iteration
%%%plotting by chunk
figure;hold on
for kkk=1:numel(chunks)-1 %iteration on space
V=0; %matrix to update after each iteration on time
for ttt=1:TT %iteration on time
fprintf(['LOADING -',num2str(ttt),'/',num2str(TT),'- STARTED!\r'])
s=chunks(kkk+1)-chunks(kkk) %size in space of the current chunk
t=new_inds{ttt}(end)-new_inds{ttt}(1)+1 %size in time of the current chunk
memory
tic
%load the velocitites on the current chunk
Uvel=ncread(uvelnc,'Uvel',[chunks(kkk) 1 1 new_inds{ttt}(1)],...
[chunks(kkk+1)-chunks(kkk)+2 y2 Inf new_inds{ttt}(end)-new_inds{ttt}(1)+1]);
Vvel=ncread(vvelnc,'Vvel',[chunks(kkk) 1 1 new_inds{ttt}(1)],...
[chunks(kkk+1)-chunks(kkk)+2 y2 Inf new_inds{ttt}(end)-new_inds{ttt}(1)+1]);
Uvel(Uvel==-9999)=NaN;
Vvel(Vvel==-9999)=NaN;
toc
fprintf(['LOADING -',num2str(ttt),'/',num2str(TT),'- DONE!\r'])
%%%velocity module
Uvel= nansum(Uvel,4);
Vvel= nansum(Vvel,4);
[Xv,Yv,Zv]=ndgrid(lonMv(chunks(kkk):chunks(kkk+1)-1+2),latMv(1,:),uv_levs);
[Xu,Yu,Zu]=ndgrid(lonMu(chunks(kkk):chunks(kkk+1)-1+2),latMu(1,:),uv_levs);
Vvel=interpn(Xv,Yv,Zv,Vvel,Xu,Yu,Zu,'linear',NaN);
V = V + sqrt(Uvel.^2+Vvel.^2); %update the matrix V
end %of the iteration on time
V_t=V/sum(cellfun('length',new_inds)); %average V on time
%%%plotting
V_t=V_t(:,:,1); %surface values
lonP=lonMu(chunks(kkk):chunks(kkk+1)-1+2,:);
lonP(V_t==0)=NaN;
latP=latMu(chunks(kkk):chunks(kkk+1)-1+2,:);
m_pcolor(lonP,latP,V_t);
end %iteration on space