system command in parfor loop
Show older comments
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 Comments
Mario Malic
on 17 Jan 2022
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.
Answers (1)
Walter Roberson
on 17 Jan 2022
parpool
tic
parfor i=1:nfiles
cmd = sprintf('echo "%s" | multi.exe', str3{i,1});
[status,cmdout] = system(cmd, '-echo')
end
12 Comments
Sujatha
on 18 Jan 2022
Sujatha
on 18 Jan 2022
Sujatha
on 19 Jan 2022
Walter Roberson
on 19 Jan 2022
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
on 19 Jan 2022
Sujatha
on 19 Jan 2022
Walter Roberson
on 19 Jan 2022
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
on 20 Jan 2022
Walter Roberson
on 20 Jan 2022
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
on 26 Jan 2022
Sujatha
on 26 Jan 2022
Walter Roberson
on 26 Jan 2022
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
Categories
Find more on Parallel Computing Fundamentals in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!