主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

parfor 循环中保存变量

自 R2024a 起

此示例显示如何在 save 循环中使用 parfor 函数将一个或多个变量保存到文件中。

要在 save 循环体中使用 parfor 函数,必须使用 "-fromstruct" 选项。如果不使用此选项,MATLAB® 会因透明度冲突而产生错误。

您还必须确保每个工作单元或 parfor 迭代对其写入或保存数据的任何文件都有唯一的访问权限。当多个工作单元尝试写入同一个文件时,MATLAB 可能会产生错误或损坏的数据,或者一个工作单元可能会覆盖另一个工作单元的数据。这些问题更有可能发生在以下情况:

  • 每台计算机有多个工作单元,工作单元试图写入同一个文件。

  • 工作单元拥有一个共享的文件系统并使用相同的路径来识别要写入的文件。

启动一个进程工作单元的并行池。

pool = parpool("Processes");
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.

使用一个 parfor 循环 来生成数据,并在每次迭代中将数据保存到单独的 MAT 文件中。将结果变量临时存储在标量结构体中。使用 -fromstruct" 函数的 save 选项将结构体中的字段和值作为变量保存到文件中。

parfor idx = 1:pool.NumWorkers
    x = rand(1000*idx);
    s = struct("x",x);
    save(sprintf("output_%d.mat",idx),"-fromstruct",s);
end

默认情况下,parpool 将工作单元上的文件夹设置为与 MATLAB 客户端会话的文件夹相匹配。因此,客户端当前工作文件夹成为工作单元保存文件的默认文件夹。

使用 whos 函数查看其中一个文件的内容。

whos("-file","output_1.mat");
  Name         Size                Bytes  Class     Attributes

  x         1000x1000            8000000  double              

要保存多个变量,请创建一个具有多个字段的结构体,然后将字段和值保存为单独的变量。

parfor idx = 1:pool.NumWorkers
   x = rand(1000*idx);
   y = eye(idx);
   z = magic(idx);
   s = struct("x",x,"y",y,"z",z);
   save(sprintf("output_%d.mat",idx),"-fromstruct",s);
end

查看其中一个文件的内容。

whos("-file","output_2.mat");
  Name         Size                 Bytes  Class     Attributes

  x         2000x2000            32000000  double              
  y            2x2                     32  double              
  z            2x2                     32  double              

删除文件并关闭并行池。

delete output*
delete(pool);
Parallel pool using the 'Processes' profile is shutting down.

另请参阅

|

主题