MATLAB 程序在使用并行处理 (parfor) 时遇到严重的内存问题。该程序生成一系列 ECell 对象,并将它们存储在 20x20 对象矩阵中。尽管这个矩阵的总大小只有120KB左右,但当使用parfor时,程序的内存使用量迅速增加到20GB以上,最终导致MATLAB崩溃。一旦其中一个并行迭代完成并尝试将其结果存储在主矩阵中,就会出现这种过多的内存使用情况。
原始代码:
主要脚本
clear
Num_series = 20;
Num_gen = 20;
Cells_series(Num_series, Num_gen) = ECell();
inicell = ECell();
cellpara = CellPara();
parfor kkk = 1:Num_series
Cells_series(kkk, :) = series_generater(inicell, cellpara, Num_gen);
end
功能
function [Cellvec] = series_generater(inicell, cellpara, Num_gen)
[~, Newcell2, inicell.CellsWhenIni, inicell.ini_t, inicell.ini_tag, ~, ~] = RunTillDiv(inicell, cellpara, 100);
Cellvec(1, Num_gen) = inicell;
for kk = 1:Num_gen
Newcell2 = Newcell2.RenormCell;
[Newcell2, ~, Newcell2.CellsWhenIni, Newcell2.ini_t, Newcell2.ini_tag, ~, ~] = RunTillDiv(Newcell2, cellpara, 10000);
Cellvec(kk) = Newcell2;
end
end
要点:
只有使用 parfor 并行执行时才会出现该问题。 数据结构 (Cells_series) 的总大小约为 120KB。 内存使用量莫名其妙地增加到超过 20GB。 当单个并行迭代完成并尝试存储其结果时,就会出现问题。 此行为表明 MATLAB 并行计算实现中可能存在错误,而不是用户代码中的简单内存管理问题。
大多数与优化内存使用相关的方法都已使用,问题似乎与此无关,因为最大的数据:Cells_series实际上是120kb。
感谢大家提醒我 MATLAB 支持团队,我向他们寻求帮助。现在我发现这个问题是由于我忽略了值类型类和句柄类型类。 在我的 ECell 类中,我在 ECell 定义中分配了一个属性 CellsWhenIni,它是一个 ECell 数组。 MATLAB的默认类是值类型类,在函数中调用时会复制整个数据。因此,由于这种重复复制,我的对象的实际大小可能呈指数增加。 并将其灵魂修改为句柄类型的类。