我有以下示例代码:
clear;
v = zeros(100, 4);
parfor i=1:100
disp(['iteration ' num2str(i)]);
v(i,:) = [i i i i+rand(1)];
temp = v(i,:);
parsave( temp )
end
这里是解析代码,它将矩阵v的单行附加到test.dat文件中:
function parsave( single_row )
dlmwrite('test.dat', single_row, '-append', 'delimiter', ',');
问题是test.dat文件缺少某些行AND列:
...
40,40,40,40.92
6,6,6,6.8743
27
38,38,38,38.415
4,4,4,4.7561
...
如您所见,第三行缺少三列。这种方式在并行方案中是有意义的。但是如何解决这个问题?一个想法是将parfor循环分解为更小的循环(比如说长度为20而不是100的5个循环)并在parfor循环之外保存20行的批次:
parfor i=1:20 %this is changed to 20 now
disp(['iteration ' num2str(i)]);
v(i,:) = [i i i i+rand(1)];
end
parsave( v(1:20,:) )
这很好但是它不是最佳解决方案。我还看到this post表示我可以将每行保存为单独的文件,然后将它们全部合并为一个文件(类似map-reduce)。但我确信必须有一个更好的解决方案,因为在我的实际代码中,我的矩阵是60000行,我不希望单独保存60000个单个文件。任何建议表示赞赏。
答案 0 :(得分:2)
写入(二进制)文件时,您受到HDD / SSD写入速度的限制,而不受处理器速度的限制。因此,并行执行此任务是没有意义的。
此外,如果您尝试使用parfor在单个文件中写入内容,您可能会遇到冲突或竞争条件,因为两个或更多不同的进程会尝试同时更改文件。