Why can't my function write to a file when executed in parallel? (parfeval)
5 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Takafumi Shiino
il 31 Mag 2022
Commentato: Takafumi Shiino
il 2 Giu 2022
"timestamp.m" doesn't work as expected when running in parallel.
1.file_path = 'C:\Users\user\Downloads\filename.txt'
ファイルパスが上記の時は正常に動作します。
It works fine.
2.file_path = 'C:\filename.txt'
ファイルパスが上記の時はファイルは作成されませんし、エラーもでません。
No files are created and no errors occur.
訂正:エラーはでていました。
K>> f.Error
ans =
ParallelException のプロパティ:
identifier: 'MATLAB:FileIO:InvalidFid'
message: 'ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。'
cause: {}
remotecause: {[1×1 MException]}
stack: [1×1 struct]
Correction: []
function functionname
...
f = parfeval(@timestamp,0)
...
end
timestamp.m
function timestamp
stat = true;
while(stat==true)
dt = datetime('now');
fileID = fopen(file_path,'a');
fprintf(fileID,'%s\n',datestr(dt));
fclose(fileID);
pause(5)
end
end
2 Commenti
Kojiro Saito
il 31 Mag 2022
2.のときのparfevalの出力はどうなっていますか?
f = parfeval(@timestamp,0);
として、f.Errorにメッセージが書かれていないでしょうか?
Risposta accettata
Kojiro Saito
il 2 Giu 2022
Modificato: Kojiro Saito
il 2 Giu 2022
ファイルの書き込み権限が原因だと思われます。
単独でも「ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。」のエラーが生じます。
file_path = 'C:\filename.txt';
timestamp(file_path)
% Local function
function timestamp(file_path)
stat = true;
while(stat==true)
dt = datetime('now');
fileID = fopen(file_path,'a');
fprintf(fileID,'%s\n',datestr(dt));
fclose(fileID);
pause(5)
end
end
Cドライブ直下へのファイル書き込みは、管理者権限が必要になるためです。
事前に現在のユーザーで空のfilename.txtを作成し、Cドライブ直下にコピーします。その際に管理者権限が必要となります。
その後なら単独でもparfevalで実行してもエラー無く書き込めるようになります。
あるいは、リスクが高いので推奨し兼ねますが、MATLAB を管理者として起動すれば解決すると思います。
ただ、それをやるならCドライブ直下にファイルを書き込むより、C:\New のようなフォルダを作れば一般ユーザーで書き込めるので、file_path = 'C:\New\filename.txt' とかにしたほうが良いですね。
3 Commenti
Più risposte (0)
Vedere anche
Categorie
Scopri di più su 製品の管理 in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!