parfor ループ内の変数の保存
この例では、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.