Receiving I/O error 32 when opening another program (EnergyPlan) inside parfor
显示 更早的评论
Hello everyone,
I am trying to use parralel computing to run the same program (EnergyPlan) simultaneously. EnergyPlan is a energy system tool that computes whether a given energy system is able to supply the given demand. I would like to run different energy system configurations (e.g. different amounts of wind and solar power) and use an optimization algorithm to find the best setup for the given demand.
The program is set up that it opens EnergyPlan using the "system" command to execute EnergyPlan. Afterwards the results of each run are retrieved compared to see, which system scores highest. When I run the program in a simple for-loop, it works without problems. However, when I change the for-loop to a parfor-loop, the opened EnergyPlan displays the error "I/O error 32". According to sources I found this error indicates a sharing violation. The first EnergyPlan program is executed (unfortunately the program pops up so I can always see when a run is performed) just fine and it closes again. However, there is a second EnergyPlan opened while the first one is still open and this one shows the beforementioned error. According to EnergyPlan.eu the tool can be run in parallel and other researchers have done so succesfully using python or java. Therefore, I don't know why this error occurs with Matlab.
Does anyone know how to circumvent this issue? Any help would be much appreciated.
Regards,
Markus
Minimum working example (provided EnergyPlan and toolbox for Matlab are installed):
%%Paths and Folder definitions
%Path where it is located EnergyPLAN executable.
dir.energyPlanPath = 'energyPLAN.exe';
%Path of reference file.
dir.inputFilePath = 'energyPlan Data\Data\Denmark2030Alternative.txt';
%Folder where will be output resulf of EnergyPLAN.
dir.outputFolder = 'Outputs\';
REvalue = 1e4*rand(10,2);
result = zeros(size(REvalue,1),1);
parfor i = 1:length(REvalue)
% Call EnergyPlan
annualData = energyPlan(dir.energyPlanPath,...
dir.inputFilePath,dir.outputFolder,...
'input_RES1_capacity=', REvalue(i,1),... % 1st variable to be changed
'input_RES2_capacity=', REvalue(i,2)); % 2nd variable to be changed
result(i) = annualData(55); % random value taken out
end
19 个评论
OCDER
2018-8-9
Is it a toolbox, or a standalone .exe that you are using via system command? If it's a matlab program, it should work WITHOUT invoking something like system('EnergyPlan.exe')
Can you copy & paste the help info for the function you want to use? Also provide the code for using parfor, minus any extra code that isn't needed.
MD
2018-8-9
编辑:Walter Roberson
2018-8-13
OCDER
2018-8-9
I guess I'm still not seeing the system(executionString). Is this something you wrong into your code, or it's a part of EnergyPlan?
What do you get if you do:
which energyPlan
When you use system, it's the same as running from the cmd of windows, and thus it's not really running from inside Matlab. Can you copy paste the line where system is used, and tell what .m file it's in?
MD
2018-8-9
I see what you mean now in the initial post. Hmmm... how about adding a "start" in that system command of that .m file?
So something like this:
system(['start ' executionString])
OCDER
2018-8-13
so this doesn't work?
start C:\kt\EnergyPLAN\run\energyPLAN.exe -i c:\MyInputFolder\Inputfile.txt -ascii c:\MyResultFolder\MyResult.txt
I see a space in your command.
-i c:\MyInputFolder\ Inputfile.txt
^
Or modifying that matlab code as suggested?
system(['start ' executionString]) %Note the space after the word start.
MD
2018-8-13
OCDER
2018-8-13
I see. If you have spaces in the full file path to the .exe and have to use quotes, then you need to also specify the title for the start window it seems.
start "title1" "C:\Users\...\EnergyPlan\energyPLAN.exe" -i "C:\Users\...\EnergyPlan\energyPlan Data\Data\Denmark2030Alternative_tmp.txt" -ascii "C:\Users\...\EnergyPlan\Outputs\out_Denmark2030Alternative.txt"
^^^^^^^^ title of this window
MD
2018-8-13
OCDER
2018-8-13
Wait, are you using "..." in your file path, or you're just doing this to condense the file path for the posting here?
Try this in matlab, filling in the "..." with the full path to the files. The title is any title name for the window it's going to open - not important:
system('start "random_title" "c:\...\energyPlan.exe" -i "C:\Users\...\EnergyPlan\energyPlan Data\Data\Denmark2030Alternative_tmp.txt" -ascii "C:\Users\...\EnergyPlan\Outputs\out_Denmark2030Alternative.txt"')
Also note the apostrophe encasing EVERYTHING.
system('....')
^ ^
In my system, something like this works in Matlab:
parfor j = 1:4
system('start "blah" "C:\somePath\someFile.exe"')
end
OCDER
2018-8-13
Just wondering, have you asked them directly how to do use their energy plan in Matlab parfor loops? They might have a document for that somewhere that's not published.
Walter Roberson
2018-8-13
The line
changeInputEnergyPlan(inputFilePath,newInputFilePath,varargin);
looks to me as if it is likely doing an assignin('caller') or assignin('base') or changing global variables.
If so then you will need to toss your code into a function that you call from the parfor loop: poofing variables into existence directly inside a parfor block gets you a sharing violation.
MD
2018-8-13
MD
2018-8-13
MD
2018-8-13
OCDER
2018-8-13
energyPlanPath = 'C:\Users\HumptyDumpty\Desktop\Programme etc\Studium\4o Semestre\Master Thesis\EnergyPlan\energyPLAN.exe';
origInput = 'C:\Users\HumptyDumpty\Desktop\Programme etc\Studium\4o Semestre\Master Thesis\EnergyPlan\energyPlan Data\Data\Denmark2030Alternative_tmp.txt';
inputPre = 'C:\Users\HumptyDumpty\Desktop\Programme etc\Studium\4o Semestre\Master Thesis\EnergyPlan\energyPlan Data\Data\Denmark2030Alternative_tmp';
outputPre = 'C:\Users\HumptyDumpty\Desktop\Programme etc\Studium\4o Semestre\Master Thesis\EnergyPlan\Outputs\out_Denmark2030Alternative';
%
assert(~isempty(dir(energyPlanPath)), 'energyPlanPath is not valid. Check file name.');
assert(~isempty(dir(origInput)), 'origInput file is not valid. Check file name.');
%
%To prevent parfor from accessing and writing to same file, make copies and specify separate outputs
Inputs = cell(4, 1);
Outputs = cell(4, 1);
for j = 1:4
Inputs{j} = [inputPre num2str(j) '.txt'];
[Success, Msg] = copyfile(origInput, Inputs{j});
assert(Success, Msg);
Outputs{j} = [outputPre num2str(j) '.txt'];
end
%Attempt to run in parallel
parfor j = 1:4
executionString = sprintf('start "title" "%s" -i "%s" -ascii "%s"', energyPlanPath, Inputs{j}, Outputs{j});
system(executionString); %execution of EnergyPLAN.
end
If this fails, it seems like the author of the code did not program this to run in parallel if it is going to share a common file. The other people might be using a workaround to contain each instance of the energy plan in a separate container and then run multiple versions, similar to running it on multiple computers.
MD
2018-8-13
OCDER
2018-8-13
Nice! If that works, can you go ahead an accept the answer below? That way we know the question is answered with a working solution, and I get some reputation points :) Play around with removing start so that it waits for it to finish per parallel worker. I think the file naming and having multiple input file copies was the real issue, not start. If you do need start, then you might need another step to wait for the output file to be generated before continuing.
采纳的回答
更多回答(0 个)
类别
在 帮助中心 和 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!


