2014-08-27 78 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)之類的東西,但這不會對您有太大的幫助。