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

2 ビュー (過去 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 Center および File ExchangeMatrix Indexing についてさらに検索

製品


リリース

R2019b

Community Treasure Hunt

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

Start Hunting!