MATLAB的内存不足吗?

时间:2014-08-27 10:10:12

标签: matlab memory-management cplex

当我运行我的代码时,我遇到了一个问题,每次运行一个相对较大的实例,然后程序卡住了,然后matlab没有响应,我需要重新启动计算机,基本上我需要使用cplexqcp函数来解决ILOG CPLEX中的SOCP问题。我调试代码,以下是程序卡住的地方

    for i=1:prog.Sddcount
        if prog.Sdd(i).totalSddVars~=0
            for j=1:prog.Sdd(i).totalSdd   
                diagvec = sparse([varSum+prog.Sdd(i).numAlpha+(j-1)*5+4:varSum+prog.Sdd(i).numAlpha+(j-1)*5+6],[1 1 1],[1 -1 1],prog.Socp.numVars+1,1);

                prog.Socp.qc(alphaSum+j).a=sparse([],[],[],prog.Socp.numVars+1,1);
                prog.Socp.qc(alphaSum+j).rhs=0;              
                prog.Socp.qc(alphaSum+j).Q = spdiags(diagvec(:),0,prog.Socp.numVars+1,prog.Socp.numVars+1);     
            end
            alphaSum = alphaSum + prog.Sdd(i).totalSdd;
        end
        varSum = varSum + prog.Sdd(i).totalVars;
    end

杀死程序的一个实例的参数是

prog.Sddcount=11;
[prog.Sdd.totalSdd]=[1540  1540  1540  1540  1540  1540  1540  1540  1540  1540 7875] 
prog.Socp.numVars=117061;

我猜它可能是矩阵Q的巨大尺寸(117061乘117061)和大数(sum([prog.Sdd.totalSdd])),但它非常稀疏,只有三个条目非零,所以我认为没问题......但每次我运行类似大小的实例时,它都会崩溃。从上面的信息,谁能告诉问题在哪里?它是内存不足还是我需要提前为

分配足够的内存
prog.Socp.qc.Q 

我该如何修改代码? 非常感谢。

1 个答案:

答案 0 :(得分:2)

其他人已经帮助OP发现他的程序正在使用所有计算机的物理内存并且基本上冻结了计算机。检查这一点的一种方法是包括以下代码;

max_memory_bytes = 2^32; %limit my script to 4Gb

for i = doing stuff
stuff stuff stuff

mem = memory;
if mem.MemUsedMATLAB > max_memory_bytes
    error('Matlab exceeded memory limit of %d Bytes',max_memory_bytes);
end

内存是一种内置函数,可提供一些有用的信息。通过定期调用,可以在计算机冻结之前自动监视内存使用情况并输出错误。当然,如果你在循环内部调用类似ones(1e4)的东西,它会占用大量的内存,这个补充对你的帮助不大。