matlab內存溢出問題

由於在使用的過程中,由於存儲單元的不斷的被分配和清除,內存會被分割成不連續的區域,這是很容易造成“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,右鍵“我的電腦”->屬性->高級->性能->設置,從而改變其虛擬內存。
8。儘量少使用系統資源(對於Windows)
Windows中字體、窗口等都是要佔用系統資源的,所以在Matlab運行時儘量不要打開不用的窗口。
9。如果沒有必要,不要啓動java虛擬機,採用matlab -nojvm啓動 (在快捷方式屬性裏面的 "..../matlab.exe") 改爲("...../matlab.exe" - nojvm)
10。關閉Matlab Server

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章