【问题标题】:How can I save individual iterations of a parfor loop如何保存 parfor 循环的单个迭代
【发布时间】:2012-08-27 01:17:08
【问题描述】:

我正在努力保存每次 PARFOR 迭代的输出,但直到现在都没有成功。我在网上搜索了很多,根据一些官方的 newgroup 回复,处理保存在 PARFOR 中的正确方法(即解决“透明度”问题)是以下列方式使用外部函数(基本示例) :

parfor i=1:120
  display(i);
  [LL ll] = eig(rand(1000,1000));
  record(:,i) = diag(ll);
  samplesave('save.mat',record(:,i),i);
end

随着

function samplesave(fname, data,i)
   persistent st;
   store(:,i)=data;
   save(fname);
end

问题在于,将“st”声明为 PERSISTENT 会使变量在同一工作人员的调用中变得“持久”,而不是在 PARFOR 循环中,因此在任何给定点,您都只有最后一个设法保存的工人的全部历史;下一次 PARFOR 迭代(来自不同的工作人员)将用(仅)该工作人员的整个历史记录覆盖该记录,依此类推。

如何逐步保存所有工作人员的历史记录?

谢谢,

【问题讨论】:

    标签: matlab parallel-processing


    【解决方案1】:

    我认为你不能等到循环终止后保存整个矩阵是有原因的。

    一个想法是使用类似这样的方法独立保存每个迭代:

    baseFile = ('part_%03d.mat');
    parfor i=1:120
      display(i);
      [LL ll] = eig(rand(1000,1000));
      singleRecord = diag(ll);
      record(:,i) = singleRecord;
      save(sprintf(baseFile, i), 'singleRecord');
    end
    

    然后一个一个地加载文件并将这些值组合成一个矩阵。

    mat = [];
    baseFile = ('part_%03d.mat');
    for i = 1:120
      d = load(sprintf(baseFile, i));
      mat(:,i) = d.singleRecord;
    end
    

    【讨论】:

    • 谢谢。这种需求背后的原因主要是防止由于潜在的停电/软件崩溃导致数据丢失,因为我需要运行脚本长达几天。您的示例中需要进行一些(小)更正:1)singleRecord 是 ParToolbox 术语中的非分类变量,不能以这种方式使用,2)为了保存,仍然需要调用外部函数。但是,总体而言,您的想法很有用,实际上可以规避问题。唯一的缺点是,如果次数或迭代次数非常多,最终会产生数千个文件。
    • @AndreaGiannuzzi 我不确定您对 singleRecord 未分类是什么意思。我很确定它是一个临时变量,因为它在循环内创建在循环外是不可访问的。 mathworks.com/help/toolbox/distcomp/brdqtjj-1.html#bq_of7_-5 如果您发现自己对文件感到不知所措,您可能会考虑明确创建一个临时目录来保存文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2022-11-12
    相关资源
    最近更新 更多