首页 > 解决方案 > 迭代地将行添加到 parfor 循环内的文件中

问题描述

我有以下示例代码:

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 文件缺少一些行和列:

...

40,40,40,40.92

6,6,6,6.8743

27

38,38,38,38.415

4,4,4,4.7561

...

如您所见,第三行缺少三列。这种在并行方案中是有意义的。但是如何解决这个问题?一个想法是将 parfor 循环分解成更小的循环(比如 5 个长度为 20 而不是 100 的循环)并在 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,:) )  

这工作正常,但它不是最佳解决方案。我还看到了这篇文章,它建议我可以将每一行保存为一个单独的文件,然后将它们全部合并到一个文件中(类似于 map-reduce)。但我确信必须有一个更好的解决方案,因为在我的实际代码中,我的矩阵是 60000 行,我不想单独保存 60000 个单个文件。任何建议表示赞赏。

标签: matlab

解决方案


写入(二进制)文件时,您会受到 HDD/SSD 写入速度而不是处理器速度的限制。因此,并行执行此任务是没有意义的。

此外,如果您尝试使用 parfor 在单个文件中写入内容,您可能会遇到冲突或竞争条件,因为两个或多个不同的进程会尝试同时更改文件。


推荐阅读