fopen and fprintf do not work within parfor or smpd running on grid
조회 수: 10 (최근 30일)
이전 댓글 표시
Hello everyone,
I met a problem to use fopen and fprintf within parfor or smpd when I run my codes on grid. Here are my codes:
spmd
fid = fopen(sprintf( 'worker_%d.csv', labindex ),'w');
fprintf(fid,'%s\r\n',vector1);
fclose(fid);
...
end
OR
parfor i=1:100
t = getCurrentTask();
fid = fopen(sprintf( 'worker_%d.csv', t.ID ),'w');
fprintf(fid,'%s\r\n',vector1);
fclose(fid);
...
end
Neither one would work, and both of them will generated the similar error messages:
spmd:
??? Error using ==> spmd_feval at 8
Error detected on lab(s) 2 15 16
Error in ==> BruteForce2>(spmd) at 103
spmd
Error in ==> BruteForce2 at 103
spmd
Caused by:
Invalid file identifier. Use fopen to generate a valid file identifier.
Error stack:
BruteForce2>(spmd body) at 105
Invalid file identifier. Use fopen to generate a valid file identifier.
Error stack:
BruteForce2>(spmd body) at 105
Invalid file identifier. Use fopen to generate a valid file identifier.
Error stack:
BruteForce2>(spmd body) at 105
PARFOR:
??? Error using ==> parallel_function at 598
Error in ==> BruteForce2>(parfor body) at 146
Invalid file identifier. Use fopen to generate a valid file identifier.
Error in ==> BruteForce2 at 105
parfor i = 1:g
The problem is my fopen, fid returns -1. The codes are running ok with local workers. So would it be some writing permission issues? I would like to know what the problem is, and where our admin should change on his side. Could anyone give me any suggestion? Thanks a lot!
Rui
댓글 수: 0
채택된 답변
Walter Roberson
2013년 5월 3일
fname = sprintf( 'worker_%d.csv', t.ID );
[fid, message] = fopen(fname, 'w');
if fid < 0;
fprintf(2, 'failed to open "%s" because "%s"\n', fname, message);
%and here, get out gracefully
end
댓글 수: 9
Walter Roberson
2013년 5월 6일
Are all the fopen() failing, or only some of them? Try something like,
fname = sprintf( 'worker_%d.csv', t.ID );
fprintf(2, 'About to open "%s"\n', fname);
[fid, message] = fopen(fname, 'w');
if fid < 0;
fprintf(2, 'failed to open "%s" because "%s"\n', fname, message);
%and here, get out gracefully
else
fprintf(2, 'Success opening "%s"\n', fname);
fprintf(fid,'%s\r\n',vector1);
fclose(fid);
fprintf(2,, 'Closed file "%s"\n', fname);
end
추가 답변 (2개)
Jason Ross
2013년 5월 6일
It's possible that the workers are running under a different user name than yours. You haven't provided the specifics of the operating systems and what schedulers you are using, but you can get this information using
spmd
system('whoami')
end
And then make sure that username also has access to the directories where you want to open the files.
Jan
2013년 5월 4일
- Do you have write permissions to the current directory?
- Is the file open already from a former crashing call? See fopen all.
- Is the file opened from another application?
Using absolute filenames is an important strategy especially for parallel processing and multi-threading. Checking the success of FOPEN is a good programming practize also.
참고 항목
카테고리
Help Center 및 File Exchange에서 Parallel for-Loops (parfor)에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!