Why can't my function write to a file when executed in parallel? (parfeval)
5 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Takafumi Shiino
am 31 Mai 2022
Kommentiert: Takafumi Shiino
am 2 Jun. 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 Kommentare
Kojiro Saito
am 31 Mai 2022
2.のときのparfevalの出力はどうなっていますか?
f = parfeval(@timestamp,0);
として、f.Errorにメッセージが書かれていないでしょうか?
Akzeptierte Antwort
Kojiro Saito
am 2 Jun. 2022
Bearbeitet: Kojiro Saito
am 2 Jun. 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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu 製品の管理 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!