最近有讀者在使用Matlab過程中遇到了"out of memory"的問題。在matlab中此類問題非常常見,我也遇到過很多。一般來說,使用的矩陣的維數一旦過萬,我就會雙手合十,祈禱上蒼,保佑我的記憶體贏得最終勝利。在網上也有很多介紹防止這類問題的文章或文章,我也試過很多,有的還行,有的貌似沒啥用。此篇部落格只是總結總結個人的經驗而已,希望對大家有所協助。
解決辦法 1:開啟電腦的3GB開關。
這是我用過的所有方法中最行之有效一個。我的電腦雖然配置的記憶體是3GB,但受XP系統的限制,實際上分配給應用程式的記憶體很小很小。所以我們需要開啟電腦的3GB開關。具體做法是:
右鍵點擊我的電腦 -> 屬性 -> 進階 -> 啟動和故障恢複 -> 設定 -> 編輯。
進入boot.int,將你的系統名
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional "
改為
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional
with 3GB switche" /3gb
重新啟動,效果立現,在matlab中輸入feature('memstats'),可以看到現在的實際記憶體已經變為了3GB。
解決辦法 2:使用pack
在matlab中,對於非稀疏的矩陣而言,只有整塊的記憶體才能夠被使用。比如你有兩塊記憶體,一塊500M,一塊200M,而矩陣所需的空間要600M,即使500+200>600,可你還是不能正常運行。而pack即為記憶體片段的拼接方法。
所以,最好讓matlab程式分段運行,在每一段運行前,在matlab命令列中敲入"pack"。如所示:
可以將小記憶體片段充分利用起來,積少成多,緩解記憶體危機。
解決辦法 3:及時釋放不用的變數
用很多變數以後用不到,或暫時用不到。對於前者,可以微微一笑,直接clear掉,眼睛都不帶眨的。而對於後者,可以先將其存入檔案然後clear,待到用時再load進來即可。
解決辦法 4:採用疏鬆陣列
對於0很多的矩陣,盡量採用疏鬆陣列的方式儲存。
如果上述辦法都沒有用的話,就只能在自己程式中找找原因了,看看能不能改改程式結構,或者讓矩陣分次處理。
如果還不行。。。。。。那隻有雙手合十了^_^