连续的parsim不断增加内存使用量(Ubuntu)

16个视图(30天)
你好,
我试图执行一个参数扫描使用parsim仿真软件模型。金宝app然而,在parsim多次呼吁(后~ 24 h) Matlab被杀死了(我使用Ubuntu 20.04)。ubuntu,我开始Matlab的终端输出显示“死亡”。
一探究竟我注意到内存使用量不断增加。我停止程序,关闭平行池(删除(gcp (nocreate))),释放一些内存。我清除工作区并没有运行了,然而Matlab仍然需要40%的内存(见htop截图),直到现在我无法找到这是从哪里来的。
我试着抽象的重要命令来澄清我的程序的结构和使用的命令(原脚本多参数等)。简而言之,在嵌套的for循环结合我创建一个数组的模型参数值。金宝appSimulationInput对象包含 batch_size 对象,使用parsim运行模拟,创建另一个数组,再次运行parsim等等:
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;
模型=“modelName”;
cnt_exp = 0;
cnt_file = 0;
cnt_batch = 0;
start_val = start_vals
stop_val = stop_vals
cnt_exp = cnt_exp + 1;
议员= setParam (MP, start_val, stop_val)
simulation_length = 12;
cnt_batch = cnt_batch + 1;
sim_input (cnt_batch) =金宝app Simulink.SimulationInput(模型);
sim_input (cnt_batch) = sim_input cnt_batch .setVariable (“simulation_length”,simulation_length);
sim_input (cnt_batch) = sim_input cnt_batch .setVariable (“议员”MP);
如果cnt_batch < batch_size
total_runs = cnt_file * batch_size + cnt_exp;
如果total_runs ~ = sum_exp%处理最后一个不完整的批处理
继续;
结束
结束
total_runs = cnt_file * batch_size + cnt_exp;
试一试
simOut = parsim (sim_input);
res = 1:长度(simOut)
%的过程结果
结束
%保存结果
cnt_file = cnt_file + 1;
%重置计数器和数组
cnt_exp = 0;
cnt_batch = 0;
清晰的sim_input;
错误
警告(“错”)
结束
结束
结束
我非常感谢任何帮助或提示在这里出现了什么问题!

接受的答案

埃尔莎Bunz
埃尔莎Bunz 2021年10月13日
我设法通过适应的使用来解决这个问题 sim_input simOut。 清楚显然不释放内存,Unix系统和删除不工作的话,这些数组,我避免使用明确的初始化 sim_input 外的for循环。此外,我把所有的计算有关 simOut 成一个函数,希望这额外的范围会清除内存。我没有单独检查措施的效果,但我认为主要 sim_input 导致这个问题。
这大约是没有内存泄漏的代码:
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;
模型=“modelName”;
cnt_exp = 0;
cnt_file = 0;
cnt_batch = 0;
我= 1:batch_size
sim_input (i) =金宝app Simulink.SimulationInput(模型);
结束
start_val = start_vals
stop_val = stop_vals
cnt_exp = cnt_exp + 1;
议员= 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);
如果cnt_batch < batch_size
total_runs = cnt_file * batch_size + cnt_exp;
如果total_runs ~ = sum_exp%处理最后一个不完整的批处理
继续;
结束
结束
total_runs = cnt_file * batch_size + cnt_exp;
试一试
result_arr = callParSim (sim_input);
%保存结果
cnt_file = cnt_file + 1;
%重置计数器和数组
cnt_exp = 0;
cnt_batch = 0;
错误
警告(“错”)
结束
结束
结束
函数result_arr = callParSim (sim_input)
simOut = parsim (sim_input);
res = 1:长度(simOut)
%的过程结果,计算result_arr
结束
结束

更多的答案(0)

类别

找到更多的在手动性能优化帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!