Matlab 在parfor循环中迭代地将行添加到文件中
我有以下示例代码:Matlab 在parfor循环中迭代地将行添加到文件中,matlab,Matlab,我有以下示例代码: 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 下面是parsave代码,它将矩阵v的单行追加到test.dat文件中: function parsave( single_row ) dlmwrite('t
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
下面是parsave代码,它将矩阵v的单行追加到test.dat文件中:
function parsave( single_row )
dlmwrite('test.dat', single_row, '-append', 'delimiter', ',');
问题是test.dat文件缺少一些行和列:
40,40,40,40.92
6,6,6,6.8743
二十七
38,38,38,38.415
4,4,4,4.7561
如您所见,第三行缺少三列。这在并行方案中是有意义的。但如何解决这个问题呢?一个想法是将parfor循环分解为更小的循环(例如5个长度为20而不是100的循环),并将20行的批保存在parfor循环之外:
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,:) )
这很好,但不是最佳解决方案。我还看到,这表明我可以将每一行保存为一个单独的文件,然后将它们全部合并到一个文件中(类似于map reduce)。但我确信一定有更好的解决方案,因为在我的实际代码中,我的矩阵是60000行,我不想单独保存60000个文件。如有任何建议,我们将不胜感激 写入(二进制)文件时,您受到HDD/SSD写入速度的限制,而不是处理器速度的限制。因此,并行执行此任务是没有意义的
此外,如果您试图使用parfor在单个文件中写入内容,您可能会遇到冲突或争用情况,因为两个或多个不同的进程将尝试同时更改文件 不要在并行代码上写入文件。不,很糟糕。不。@AnderBiguri你能在有机会的时候再详细阐述一下吗?两个人如何在同一时间在同一篇论文中写作?还有64个人?他们不能,有“写冲突”。在你链接的另一个问题中,回答者所做的是给每个人一份不同的论文。这是确保两个人不能同时在同一个地方写东西的唯一方法。此外,与其他任何事情相比,向磁盘写东西的速度都非常慢。同时,将内存移入和移出并行核的速度也非常慢。因此,由于正在向磁盘写入数据,您正在失去并行计算本可以赢得的所有速度。这就像每10公里就有一列高速列车停下来一样。你不会更快到达终点的。