处理大型数据集
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
.
的开销,更少的文件将被更快地处理
我的 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
.