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

5 vues (au cours des 30 derniers jours)
Kenta
Kenta le 26 Sep 2022
Commenté : Kenta le 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

Réponse acceptée

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

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur 環境と設定 dans Help Center et File Exchange

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!