1. 程式人生 > >Matlab使用過程中記憶體不足問題的總結(修改)

Matlab使用過程中記憶體不足問題的總結(修改)

轉載自:http://blog.csdn.net/xiaojidan2011/article/details/8089532

20170306修改:

因為重灌系統,裝了R2016a版本,增加了一個4G的金士頓記憶體條(總記憶體8G),使用了一個多月了,沒有發現記憶體不足的問題。

警告並不是說真的實體記憶體用完了,一般out of memenry存在以下幾種情況:
1、 變數需要的儲存空間超過了可用的記憶體空間
2、 資料需要的儲存空間,超過記憶體中最大的可用連續儲存空間
3 、程式和問題求解方法的設計不周,導致記憶體溢位

       個人認為,第一種出現情況最少,第二種出現情況應該是大眾情況,第三種那我只能說你是個不太地道、不夠細心的程式設計師,至少分配大點的地方給變數麼!!下面就簡單說下處理和應對方法:



       由於在使用的過程中,由於儲存單元的不斷的被分配和清除,記憶體會被分割成不連續的區域,這是很容易造成“Out of Memory”。

1、為矩陣變數預製記憶體而不是動態分配
       在動態分配的過程中,由於開始Matlab所用的Block隨著矩陣的增大而連續的為此矩陣分配記憶體,但是由於Block的不連續性,很有可能最開始分配的Block不能滿足儲存的需要,Matlab只好移動此Block以找到更大的Block來儲存,這樣在移動的過程中不但佔用了大量的時間,而且很有可能它找不到更大的塊,導致Out of Memory。而當你為矩陣變數預製記憶體時,Matlab會在計算開始前一次性找到最合適的Block,此時就不用為變數連續的分配記憶體。

比較下面兩個程式:
       (1)for k = 2:1000
                      x(k) = x(k-1) + 5;
                end
      (2)x = zeros(1, 1000);
                for k = 2:1000
                      x(k) = x(k-1) + 5;
                end
     顯然,第二個更好!!!最好的方法是,在程式一開始就位所有大的矩陣變數預製存儲存單元!!!

2、儘量早的分配大的矩陣變數
        Matlab使用heap method管理記憶體。當在Matlab heap中沒有足夠的記憶體使用時,它會向系統請求記憶體。但是隻要記憶體碎片可以存下當前的變數,Matlab會重新使用記憶體。所在在大記憶體變數clear以後,新建的小記憶體變數仍可以使用那部分記憶體空間,但相反就不行了。比如說a變數4M,b、c、d、e分別為1M,如果a被clear以後定義bcde,則可以使用a的空間,如果clear b,c,d,e以後,假如這四個變數不是連續的,那麼a就不能使用它們釋放的記憶體。

3、儘量避免產生大的瞬時變數,當它們不用的時候應該及時clear

4、將矩陣轉化成稀疏形式
    如果矩陣中有大量的0,最好儲存成稀疏形式。稀疏形式的矩陣使用記憶體更少,執行時間更短。

5、使用pack命令
      當記憶體被分為很多碎片以後,其實本身可能有很大的空間,只是沒有作構的連續空間即大的Block而已。如果此時Out of Memory,此時使用pack命令可以很好的解決此問題。

6、如果可行的話,將一個大的矩陣劃分為幾個小的矩陣,這樣每一次使用的記憶體減少。

7、增大虛擬記憶體
     Windows XP,右鍵“我的電腦”->屬性->高階->效能->設定,從而改變其虛擬記憶體。
      Windows 7,右鍵“計算機”->屬性->(左邊欄)高階系統設定->高階->(效能)設定->高階->(虛擬記憶體)更改,建議實體記憶體的兩倍左右,如果實體記憶體已經3G+,那就不用調整了。

8、儘量少使用系統資源(對於Windows)
     Windows中字型、視窗等都是要佔用系統資源的,所以在Matlab執行時儘量不要開啟不用的視窗。

9、如果沒有必要,不要啟動Java虛擬機器,採用matlab -nojvm啟動 (在快捷方式屬性裡面的 "..../matlab.exe") 改為("...../matlab.exe" - nojvm)

10、關閉Matlab Server