Consecutive call of parsim constantly increases memory usage (Ubuntu)

Illustration
shyan_andras - 2021-10-20T14:53:17+00:00
Question: Consecutive call of parsim constantly increases memory usage (Ubuntu)

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!

Expert Answer

Profile picture of John Williams John Williams answered . 2025-11-20

I managed to solve the issue by adapting the usage of sim_input and simOut. As clear apparently does not free the memory in Unix systems and delete somehow didn't work with these arrays, I avoided using clear and I initialized sim_input outside of the for-loop. Furthermore, I put all calculations concerning simOut into a function, hoping that this additional scope would clear the memory. I didn't check the effect of both measures separately, but I think mainly sim_input was causing the problem.
 
So this is approximately how the code without memory leak looks like now:
 
 
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


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!