我必须阅读然后处理大量数据(矩阵:~40.000.000x19)。
第一步是读取数据:
Array = load('vort.dat');
flie' vort.dat'包含~40.000.000(imax * jmax * kmax)行和19行,第一行是:
3.53080034E-03 0.00000000 1.25000002E-02 63.0216064 -3.03968048 -358.802948 -744.902588 -2.51340670E-10 2.11566061E-04 18.6898212 72.3569489 0.727692425 0.754972637 0.661218643 1.50408816 1.87408039E-03 5.69900125E-03 0.00000000 0.00000000
比我遍历数组并将后处理的各种值存储到单独的数组中:
imax=511;
jmax=160;
kmax=399;
for q=1:length(Array(:,1))
Rp(k,j,i)=Array(q,1);
yp(k,j,i)=(0.5-Rp(k,j,i))*360;
...
% index variables
k=k+1;
if(k>kmax)
k=1;
i=i+1;
if(i>imax)
i=1;
j=j+1;
if(j>jmax)
j=1;
end
end
end
end
比后期处理开始!
问题是matlab在数据处理期间或绘制数字时没有出现警告而崩溃!
我已经将堆栈大小设置为无限制(ulimit -s unlimited)。
第二个想法是使用memmapfile,看起来它正在工作,但后处理的图表显示它没有读取正确的数据!
%%% Array = load('vort.dat');
m=memmapfile('data.dat','Format',{'double',[imax*jmax*kmax 19], 'x'},'repeat', 1);
Array=m.data.x;
答案 0 :(得分:1)
如果您在预处理期间内存不足,您可能需要在加载大量数据之前清除MATLAB的内存:
clear('all');
Array = load('vort.dat');
%'Here continues the pre-processing'
如果您在后期处理过程中内存不足,则可能需要在不再使用大量变量后清除它们。例如,由于预处理后不再使用Array
,因此请使用以下命令开始后处理:
clear('Array');
或更简单:
Array = 0;
考虑到矩阵的大小,这应该释放足够的内存,以便您继续进行后处理和报告。
因此,例如,脚本看起来像:
%//Preparing
clear('all'); %//Start with fresh memory
dbstop('if', 'error'); %//Trap uncaught exceptions
%//Loading
A = load('vort.dat');
%//Pre-processing, vectorized operations
I = 511;
J = 160;
K = 399;
Rp = permute(reshape(A(:,1),K,I,J), [1 3 2]);
yp = (0.5 - Rp)*360;
%//...
%//Post-processing
clear('A'); %//and other vars not needed anymore
%//...