メインコンテンツ

parfor ループ内の変数の保存

R2024a 以降

この例では、parfor ループで save 関数を使用して 1 つ以上の変数をファイルに保存する方法を説明します。

parfor ループの本体で save 関数を使用するには、"-fromstruct" オプションを使用する必要があります。このオプションを使用しない場合、MATLAB® では透過性の違反によりエラーが発生します。

また、各ワーカーまたは parfor の反復が、データの書き込みや保存を行うファイルに単独でアクセスすることを確認する必要もあります。複数のワーカーが同一のファイルに書き込みを試みると、MATLAB でエラーやデータの破損が発生したり、1 つのワーカーが別のワーカーのデータを上書きする可能性があります。これらの問題は以下の場合に発生の可能性が高くなります。

  • 1 つのマシンにつき複数のワーカーがあり、それらのワーカーが同じファイルに書き込もうとする。

  • ワーカーに共有ファイル システムがあり、同じパスを使用して書き込み対象のファイルを指定する。

プロセス ワーカーの並列プールを起動します。

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

parfor ループを使用してデータを生成し、反復ごとに個別の MAT ファイルに保存します。結果の変数をスカラー構造体に一時的に保存します。save 関数の "-fromstruct" オプションを使用して、構造体のフィールドと値を変数としてファイルに保存します。

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.

参考

|

トピック