这是我的代码的简化版本。我想要获得的是result.mat中包含的variable1 - row向量。问题是解析 - 只保存一个结果,即第10次迭代的最后一个结果。如何将所有结果保存在parfor循环内的一个向量(在variable1中)?
parfor ii = 1:10
[variable1, variable2] = MyFunction(~,~,ii);
parsave('result.mat',variable1, variable2)
end
function parsave(filename, varargin)
narginchk(2, Inf);
nargoutchk(0, 0);
for I = 2:nargin
varname = genvarname(inputname(I));
eval([varname ' = varargin{' num2str(I-1) '};'])
if (I == 2)
save(filename, varname)
else
save(filename, varname, '-append')
end
end
答案 0 :(得分:0)
在parsave
内,您有以下声明:
if (I == 2)
save(filename, varname)
else
save(filename, varname, '-append')
end
因此,在parsave
的第一次传递中,每次运行parsave
时,都会覆盖filename
。
此外,您的代码对于竞争条件来说是一个巨大的风险:假设两个进程同时尝试对文件进行“初始保存” - 一个将覆盖另一个,或者抛出“不能”访问文件“错误。
在parfor循环中保存到临时文件要好得多,并且要使用聚合器函数来完成这项工作,该函数将不同的保存组合成有用的东西 - 或者每次运行循环时只需保存到新目录中,而不是创建一个新文件。
答案 1 :(得分:0)
parpool('local',10); % results will be distributed on 10 workers
output1=distributed.NaN(1,1e5); %pre-allocate
output2=distributed.NaN(1,1e5);
spmd
for i=drange(1:1e5)
[output1(ii), output2(ii)] = MyFunction(~,~,ii);
parsave(['output1', num2str(labindex)],...
getLocalPart(output1));
parsave(['output2', num2str(labindex)],...
getLocalPart(output2));
end
end
我已经使用了2次解析函数,所以如果机器在模拟结束前关闭,10个mat文件将保存临时结果,以后我需要连接(对于output1& amp; ; output2)
解析函数是:
function parsave(fname,data)
var_name=genvarname(inputname(2));
eval([var_name '=data'])
try
save(fname,var_name,'-append')
catch
save(fname,var_name)
end
% Written by Minjie Xu (<mailto:chokkyvista06@gmail.com chokkyvista06@gmail.com>)