处理大型数据集

时间:2016-07-25 08:41:48

标签: matlab 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

然后通过单独处理每个轨迹y并累积结果来获取n=1:100

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

有更优雅的方式吗?我有100GB的RAM和12名工人。

1 个答案:

答案 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的开销会减少更少的文件处理速度。