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

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

댓글을 달려면 로그인하십시오.

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 製品の管理에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!