当函数输出发送到主脚本时,Matlab 内存使用量意外增加

问题描述 投票:0回答:1

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 out-of-memory
1个回答
0
投票

感谢大家提醒我 MATLAB 支持团队,我向他们寻求帮助。现在我发现这个问题是由于我忽略了值类型类和句柄类型类。 在我的 ECell 类中,我在 ECell 定义中分配了一个属性 CellsWhenIni,它是一个 ECell 数组。 MATLAB的默认类是值类型类,在函数中调用时会复制整个数据。因此,由于这种重复复制,我的对象的实际大小可能呈指数增加。 并将其灵魂修改为句柄类型的类。

© www.soinside.com 2019 - 2024. All rights reserved.