Hi, I am trying to perform a parameter sweep on my simulink model using parsim. However, after parsim has been called for several times (after ~24h) Matlab gets killed (I am using Ubuntu 20.04). The ubuntu terminal output from where I started Matlab just shows "Killed". Taking a closer look I noticed that memory usage constantly increases. I stopped the program and shut down the parallel pool (delete(gcp('nocreate'))) which released some memory. I cleared the workspace and nothing is running anymore, however Matlab still takes 40% of the memory and until now I could not find out where this comes from. I tried to abstract the important commands to clarify the structure of my program and my usage of the commands (the original script has much more parameters etc). In short, in nested for-loops combining my parameter values I create an array of Simulink.SimulationInput objects containing batch_size objects, run the simulations using parsim, create another array, run parsim again and so on: start_vals = [0.1, 0.08, 0.06, 0.04, 0.03, 0.02]; stop_vals = [0.04, 0.03, 0.02, 0.01, 0.0, -0.05]; batch_size = 50; model = 'modelName'; cnt_exp = 0; cnt_file = 0; cnt_batch = 0; for start_val = start_vals for stop_val = stop_vals cnt_exp = cnt_exp +1; MP = setParam(MP,start_val, stop_val) simulation_length = 12; cnt_batch = cnt_batch +1; sim_input(cnt_batch) = Simulink.SimulationInput(model); sim_input(cnt_batch) = sim_input(cnt_batch).setVariable('simulation_length',simulation_length); sim_input(cnt_batch) = sim_input(cnt_batch).setVariable('MP',MP); if cnt_batch < batch_size total_runs = cnt_file * batch_size + cnt_exp; if total_runs ~= sum_exp % last incomplete batch has to be processed continue; end end total_runs = cnt_file * batch_size + cnt_exp; try simOut = parsim(sim_input); for res = 1:length(simOut) % Process result end % Save results cnt_file = cnt_file +1; % Reset counters and arrays cnt_exp = 0; cnt_batch = 0; clear sim_input; catch error warning ("Something went wrong") end end end I'd greatly appreciate any help or hint on what is going wrong here!
John Williams answered .
2025-11-20
start_vals = [0.1, 0.08, 0.06, 0.04, 0.03, 0.02];
stop_vals = [0.04, 0.03, 0.02, 0.01, 0.0, -0.05];
batch_size = 50;
model = 'modelName';
cnt_exp = 0;
cnt_file = 0;
cnt_batch = 0;
for i=1:batch_size
sim_input(i) = Simulink.SimulationInput(model);
end
for start_val = start_vals
for stop_val = stop_vals
cnt_exp = cnt_exp +1;
MP = setParam(MP,start_val, stop_val)
simulation_length = 12;
cnt_batch = cnt_batch +1;
sim_input(cnt_batch) = sim_input(cnt_batch).setVariable('simulation_length',simulation_length);
sim_input(cnt_batch) = sim_input(cnt_batch).setVariable('MP',MP);
if cnt_batch < batch_size
total_runs = cnt_file * batch_size + cnt_exp;
if total_runs ~= sum_exp % last incomplete batch has to be processed
continue;
end
end
total_runs = cnt_file * batch_size + cnt_exp;
try
result_arr = callParSim(sim_input);
% Save results
cnt_file = cnt_file +1;
% Reset counters and arrays
cnt_exp = 0;
cnt_batch = 0;
catch error
warning ("Something went wrong")
end
end
end
function result_arr = callParSim(sim_input)
simOut = parsim(sim_input);
for res = 1:length(simOut)
%Process result, calculate result_arr
end
end