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

6 views (last 30 days)
Kenta
Kenta on 26 Sep 2022
Commented: Kenta on 27 Sep 2022
計算時間削減のため、並列処理(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

Accepted Answer

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

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!