Why can't my function write to a file when executed in parallel? (parfeval)

5 Ansichten (letzte 30 Tage)
"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
Kojiro Saito am 31 Mai 2022
2.のときのparfevalの出力はどうなっていますか?
f = parfeval(@timestamp,0);
として、f.Errorにメッセージが書かれていないでしょうか?
Takafumi Shiino
Takafumi Shiino am 1 Jun. 2022
コメントありがとうございます。以下のようなerrorでした。単体で動作させているときは問題ないのですがなぜなのでしょうか。
K>> f.Error
ans =
ParallelException のプロパティ:
identifier: 'MATLAB:FileIO:InvalidFid'
message: 'ファイルの識別子が無効です。有効なファイルの識別子を生成するには fopen を使用してください。'
cause: {}
remotecause: {[1×1 MException]}
stack: [1×1 struct]
Correction: []

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Kojiro Saito
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
Kojiro Saito
Kojiro Saito am 2 Jun. 2022
はい、管理者としてMATLAB を起動すればCドライブ直下にファイル書き込むのは解決はします。
Takafumi Shiino
Takafumi Shiino am 2 Jun. 2022
自己解決しました。質問には載せていませんでしたが、ファイルパスはclassdef file_Pathで定義していたfile_Path.timestampを参照していました。それが原因のようです。あとはおっしゃられているように管理者権限でした。
fileID = fopen('C:\temp\filename.txt','a');
または
parfeval(@timestamp,0,'C:\temp\filename.txt')
のようにすれば書き込み可能でした。
ありがとうございました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte


Version

R2019b

Community Treasure Hunt

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

Start Hunting!