2014-08-27 80 views
0

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

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; 

我想这可能是巨大的大小(以117061 117061)和矩阵Q的大数(sum([prog.Sdd.totalSdd]))),但它是非常稀疏的,只有三个入口非零,所以我认为它可以......但每次运行一个类似的实例大小,它崩溃。从上面的信息,任何人都可以告诉问题在哪里?是内存不足或我需要预先分配足够的内存

prog.Socp.qc.Q 

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

+1

可能需要一段时间才能完成代码,但是如果您有一个不稀疏的117061x116061矩阵(我指的是不同于0而不是稀疏类型的元素),您肯定会遇到内存问题。必须尝试使用​​调试器并检查每个断点消耗的内存吗? – patrik 2014-08-27 11:18:59

+1

是否有可能使用可执行代码重新创建此行为?我最初的猜测是,有一个转换到完整的地方,但我不能马上发现它。 – 2014-08-27 11:33:28

+2

您也可以简单地打开任务管理器,查看运行代码时内存是否填满。 – 2014-08-27 11:43:49

回答

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)之类的东西,但这不会对您有太大的帮助。