在parfor循环中使用Parsave - 仅保存我的最后一个变量结果

时间:2015-02-20 13:05:35

标签: matlab parallel-processing parfor

这是我的代码的简化版本。我想要获得的是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

2 个答案:

答案 0 :(得分:0)

parsave内,您有以下声明:

if (I == 2)
    save(filename, varname)
else
    save(filename, varname, '-append')
end

因此,在parsave的第一次传递中,每次运行parsave时,都会覆盖filename

此外,您的代码对于竞争条件来说是一个巨大的风险:假设两个进程同时尝试对文件进行“初始保存” - 一个将覆盖另一个,或者抛出“不能”访问文件“错误。

在parfor循环中保存到临时文件要好得多,并且要使用聚合器函数来完成这项工作,该函数将不同的保存组合成有用的东西 - 或者每次运行循环时只需保存到新目录中,而不是创建一个新文件。

答案 1 :(得分:0)

http://www.mathworks.com/matlabcentral/answers/179884-save-inside-parfor-loop-at-a-specific-iteration-step

上找到了优雅的解决方案
  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>)