Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在parfor循环中迭代地将行添加到文件中_Matlab - Fatal编程技术网

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公里就有一列高速列车停下来一样。你不会更快到达终点的。