迭代地将行添加到parfor循环内的文件中

时间:2018-06-07 14:05:36

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

这里是解析代码,它将矩阵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个单个文件。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:2)

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

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