100個の並列処理(​parfor)の複数​個が処理されません

6 ビュー (過去 30 日間)
Kenta
Kenta 2022 年 9 月 26 日
コメント済み: Kenta 2022 年 9 月 27 日
計算時間削減のため、並列処理(parfor)でbatファイルを100回実行したいと考えています。
下記のようなコードで実行したところ、エラーは出ませんが15~16個実行されていません。
(実行された場合、実行結果ファイルが複数個出力されるのですが、15~16個出力されていませんでした。)
解決策をご存じであれば、教えていただきたいです。
行いたい処理イメージ
1. 事前に作成したdatファイル(ex_1.dat,ex_2.dat.....ex_100.dat)の名前をcell配列として取り込んだbatファイルの指定行に書き込む
2. main.batを実行する
3. すべての番号(1から100まで)で出力結果を得る
% 繰り返し回数
N = 100;
% batファイルの行数
bat_row_size = 24;
% batファイルの名前書き換えに必要なもの
case_name = "ex_";
set = "set";
CASE = "CASE=";
parfor i = 1:N
% 現在の番号を変数に保存
number_N = num2str(i);
% batファイルをcell配列として読み込み
fid = fopen('main_ori.bat');
bat_j = 1;
bat = cell(bat_row_size,1);
while (~feof(fid))
tline = fgetl(fid);
bat{bat_j,:} = tline;
bat_j = bat_j + 1;
end
% main.batファイル内のケース名を書き換え
casename = append(set,' ',CASE,case_name,number_N);
bat(9,1) = cellstr(casename);
% batファイルをFiletypeオプションで、テキストファイルだと設定する
writecell(bat, 'main.bat','FileType','text')
% FEM実行
system('main.bat');
end

採用された回答

Kojiro Saito
Kojiro Saito 2022 年 9 月 26 日
並列処理で同じファイル名に対して書き込みをおこなっているため、ファイル競合が起きている可能性があります。
繰り返し毎にファイル名を変更して実行してみてはどうでしょうか?
parfor の中を以下のように変更します。
% batファイルをFiletypeオプションで、テキストファイルだと設定する
batname = sprintf('main_%s.bat', number_N);
writecell(bat, batname,'FileType','text')
% FEM実行
system(batname);
% 不要ファイルの削除
delete(batname)
  1 件のコメント
Kenta
Kenta 2022 年 9 月 27 日
提案していただいたコードを基に変更して実行したところ、行いたい処理ができました。
ご回答いただき、ありがとうございます。

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!