我的MATLAB程序生成N=100
个轨迹,每个轨迹都有T=10^8
个时间步,即
x = randn(10^8,100);
最终,我想处理这个数据集并获得所有轨迹的平均自相关:
y = mean(fft(x),2); % output size (10^8, 1)
既然x
太大而无法存储,我唯一可行的选择就是将它以10 ^ 6的小块保存在硬盘上
x1 = randn(10^6, 100);
x2 = randn(10^6, 100);
etc
然后通过单独处理每个轨迹y
并累积结果来获取n=1:100
:
for n=1:100
y = y + fft([x1(:,n); x2(:,n); ...; x100(:,n)]);
end
有更优雅的方式吗?我有100GB的RAM和12名工人。
答案 0 :(得分:0)
更简单的方法是生成一次数据,然后将其分成保存在磁盘上的小块,或者,如果可能的话,在工作人员自己上创建数据。
x = randn(10^8,100);
for ii=1:100
if ii ~=100
tmp = x(ii:ii+1e6)
else
tmp = x(ii:end); %ii+1e6 would result in end+1
end
filename = sprintf('Dataset%i',ii); %create filename
save(filename,tmp,'-v7.3'); %save file to disk in -v7.3 format
end
y = cell(100,1) %initialise output
parfor ii = 1:100
filename = sprintf('Dataset%i',ii); %get the filenames back
load(filename); %load the file
y{ii} = mean(fft(tmp),2); % I called it tmp when saving, so it's called tmp here
end
现在,您可以按所需方式累积单元格y
的结果。您当然可以使用您创建的文件数量,因为parfor
的开销会减少更少的文件处理速度。