system command in parfor loop
显示 更早的评论
I am invoking a C++ executable from the Matlab command prompt.
Interactively, it goes like this:
>> [status,cmdout] = system('multi.exe','-echo')
Input unique file identifier. Ex: 2~04-13-013939 - 2~11-30-091444
And this works fine.
However, I need to invoke the C++ executable multiple times. So I created a parfor loop, like so:
parpool
tic
parfor i=1:nfiles
[status,cmdout] = system('multi.exe','-echo')
str3{i,1}
end
where str3 is a series of inputs:
str3 =
14×1 cell array
{'1~11-24-054646'}
{'1~11-24-095017'}
{'1~11-29-060908'}
{'1~11-29-101743'}
{'1~11-30-091225'}
{'2~11-24-055554'}
{'2~11-24-100903'}
{'2~11-29-060541'}
{'2~11-29-101814'}
{'2~11-30-091444'}
{'3~11-24-055933'}
{'3~11-29-101847'}
{'4~11-24-060505'}
{'4~11-29-101935'}
This ran for over 54 hours, but the task never completed, and I eventually hit Ctrl-C.
Any thoughts/ feedback?
2 个评论
Mario Malic
2022-1-17
Check this out. Parfor worked fine for me using Sysem.Diagnostics.Process.
In order to relay the messages from workers in parpool, there are functions which I don't remember the name exactly. Check out this example https://www.mathworks.com/help/parallel-computing/parallel.pool.dataqueue.html
just to play devil's advocate, i've approached a similar problem in the past by calling parallel instances of matlab from the shell. it was by no means the most I/O-efficient method and wasted a lot of time opening and closing matlab & pooling. the individual system jobs were geophysical models that took O(days) so the data importing and pool opening overhead was comparatively insignificant.
回答(1 个)
Walter Roberson
2022-1-17
parpool
tic
parfor i=1:nfiles
cmd = sprintf('echo "%s" | multi.exe', str3{i,1});
[status,cmdout] = system(cmd, '-echo')
end
12 个评论
Sujatha
2022-1-18
Sujatha
2022-1-18
Sujatha
2022-1-19
Walter Roberson
2022-1-19
Perhaps you need
parpool
tic
parfor i=1:nfiles
cmd = sprintf('(echo "%s" & echo.) | multi.exe', str3{i,1});
[status,cmdout] = system(cmd, '-echo')
end
The period after the echo is important, and must be immediately after the echo with no space.
Sujatha
2022-1-19
Sujatha
2022-1-19
Walter Roberson
2022-1-19
At the windows COMMAND level,
(echo "4~11-24-060505" & echo.) |
should create an output stream that contains
4~11-24-060505<NEWLINE><NEWLINE>
and make it available as input to the next program in sequence (which here would be multi.exe)
Could you confirm for me that if you hard-code
system('multi.exe', '-echo')
that the program multi runs, but that if you hard-code
system('(echo "4~11-24-060505" & echo.) | multi.exe', '-echo')
that it fails saying it does not know what multi.exe is ?
Sujatha
2022-1-20
Walter Roberson
2022-1-20
Well, there is another possibility.
parpool
tic
parfor i=1:nfiles
tname{i} = tempfile();
[fid, msg] = fopen(tname{i});
if fid < 0
error('iteration %d failed to create temporary file "%s" because "%s"', i, tname{i}, msg);
end
fprintf(fid, '%s\n\n', str3{i,1});
fclose(fid)
cmd = sprintf('multi.exe < "%s"', tname{i});
[status,cmdout] = system(cmd, '-echo')
end
Then once you are sure that all of the executables have finished, you can delete all of the files named in tname .
Sujatha
2022-1-26
Sujatha
2022-1-26
Walter Roberson
2022-1-26
parpool
tic
parfor i=1:nfiles
tname{i} = tempname();
[fid, msg] = fopen(tname{i});
if fid < 0
error('iteration %d failed to create temporary file "%s" because "%s"', i, tname{i}, msg);
end
fprintf(fid, '%s\n\n', str3{i,1});
fclose(fid)
cmd = sprintf('multi.exe < "%s"', tname{i});
[status,cmdout] = system(cmd, '-echo')
end
类别
在 帮助中心 和 File Exchange 中查找有关 Parallel Computing Fundamentals 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!