处理大型数据集

Processing a large dataset

我的 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

然后通过对每个轨迹n=1:100单独处理,累加得到y

for n=1:100
y = y + fft([x1(:,n); x2(:,n); ...; x100(:,n)]);
end

有没有更优雅的方式来做到这一点?我有 100GB 的 RAM 和 12 名工人。

一种更简单的方法是生成一次数据,然后将其分成小块保存在磁盘上,或者,如果可能,在工作人员身上创建数据。

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.

的开销,更少的文件将被更快地处理