matlab - 迭代地将行添加到 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 个单个文件。任何建议表示赞赏。
解决方案
写入(二进制)文件时,您会受到 HDD/SSD 写入速度而不是处理器速度的限制。因此,并行执行此任务是没有意义的。
此外,如果您尝试使用 parfor 在单个文件中写入内容,您可能会遇到冲突或竞争条件,因为两个或多个不同的进程会尝试同时更改文件。
推荐阅读
- powershell - PowerShell 中的 foreach -parallel
- fish - Fish Shell:一行中的多个命令,当其中一些在后台运行时
- node.js - NodeJs函数等待回调返回值
- firebase - 从 Firestore 检索数据时出现超时错误
- mysql - 如何根据mysql中的sql条件排除结果?
- powerbi - 带有“所有”单元格数据的 PowerBI 矩阵?
- scala - 将 Scala Array[Object] 转换为 Map
- android - 添加优雅按钮并收到此错误后无法更改应用程序图标
- android - Crashlytics,如何在崩溃时设置自定义键值?
- c# - 在 UWP 的另一个响应式容器中,在 C# 中创建多个带有滚动条的 ListView