使用matlab過程中經常會出現內存不足的問題,這里轉載一篇來自http://blog.csdn.net/xiaojidan2011/article/details/8089532 的博文,解決這一問題。
做圖像處理的,對matlab這工具軟件一定不會陌生,他的高集成度為圖像處理提供了很大的方便,但我們在使用時難免會出現內存不足的問題,2、3G的內存還不夠處理一次簡單圖像,這確實很恐怖。但這里的警告並不是說真的物理內存用完了,一般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