1. 程式人生 > >Matlab記憶體不足問題的解決

Matlab記憶體不足問題的解決

最近嘗試採用matlab中的神經網路工具包做些試驗,但是資料的規模比較大,在模型訓練的過程中,總是返回“Out Of Memory”錯誤,而不能繼續訓練。嘗試了幾種可能的解決方案,最後總算解決,至少執行到現在還沒有出現這種錯誤。



  1. 增加虛擬記憶體:在檢視工作管理員發現物理記憶體為2GB,虛擬記憶體為共6GB,而觀察matlab在執行過程中使用的記憶體沒有超過2GB,因此不存在記憶體不足的問題。因此增加虛擬記憶體的方法是不可行的。
  2. 使用PACK:PACK可以將matlab中的變數匯出到磁碟中,以增加可用記憶體。但是嘗試之後,沒有解決問題。
  3. 減少變數的記憶體開銷:目前使用的變數都是必須的變數,不能再減小了。
  4. 64位架構:採用64位的軟硬體架構,目前實驗室條件下不可行。
  5. 3GB切換(3GB switch):由於在windows上執行matlab時,如果記憶體的使用超過約1.7G左右就要出現這種錯誤,而無論你有多大的記憶體也沒用。幸好現在在Windows XP上,MATLAB現在支援3GB切換(3GB switch)啟動選項(boot option),配置額外的1GB的可定址記憶體到每個程式上。這增加了你可以儲存到MATLAB workspace中資料的總量約到2.7 GB。這相當於33億的精度值。此新增的記憶體區塊和MATLAB使用剩下的(記憶體)並不是連續的,所以你不能建立一個數組來填滿此空間。


具體做法:修改C:\ Boot.ini檔案如下:

[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB 
注意後面的/3GB就是後加上的。重新啟動系統再次執行matlab。 

在採用了最後這種方法時,問題解決,至少運行了一段時間還沒有出現上面的錯誤。


參考:





轉自:http://hi.baidu.com/zxshow1983/blog/item/ecc77f23795c41569922ed70.html

另外,還有兩篇文章可能有用,放在這先:

matlab記憶體溢位的解決方案

matlab記憶體溢位的解決方案(整理)
1)增加虛擬記憶體的方法是不可行的
2)使用PACK:PACK可以將matlab中的變數匯出到磁碟中,以增加可用記憶體
3)減少變數的記憶體開銷
4)64位架構:採用64位的軟硬體架構
5)3GB 切換(3GB switch):由於在windows上執行matlab時,如果記憶體的使用超過約1.7G左右就要出現這種錯誤,而無論你有多大的記憶體也沒用。幸好現在在Windows XP上,MATLAB現在支援3GB切換(3GB switch)啟動選項(boot option),配置額外的1GB的可定址記憶體到每個程式上。這增加了你可以儲存到MATLAB workspace中資料的總量約到2.7 GB。這相當於33億的精度值。此新增的記憶體區塊和MATLAB使用剩下的(記憶體)並不是連續的,所以你不能建立一個數組來填滿此空間。

 6)更有效的優化方案調整Java虛擬機器可分配的記憶體大小

matlab java.lang.OutOfMemoryError
Java虛擬機器記憶體不夠用了.可以增加最大記憶體設定.

1. 查詢matlab根路徑.在matlab命令列中敲入:matlabroot
顯示根路徑,如:C:\MATLAB7

2.檢視當前Java虛擬機器最大堆記憶體, 敲入:java.lang.Runtime.getRuntime.maxMemory

3.檢視Java虛擬機器版本.敲入:version -java

4.在 $MATLAB\bin\$ARCH 路徑下新建java.opts檔案.
$MATLAB是根路徑,例如C:\MATLAB7
$ARCH是系統架構.例如win32,則在C:\MATLAB7\bin\win32下新建java.opts檔案.

5.用記事本開啟java.opts檔案,
對於不同的版本的Java虛擬機器,輸入:
The following table shows the default settings MATLAB uses for versions of the JVM:

JVM       Initial Heap Size     Max Heap Size
1.6.0     -Xms64m               -Xmx128m (32-bit)
                                             -Xmx196m (64-bit)
1.5.0     -Xms64m               -Xmx96m   (32-bit)
                                             -Xmx128m (64-bit)
1.4.2     -Xms16m               -Xmx96m
1.3.1     -Xms16000000         -Xmx64000000
1.2.2     -Xms16000000         -Xmx64000000
1.1.8     -ms16000000           -mx64000000

例如我的Java是1.4.2,在java.opts檔案寫入-Xmx96m,儲存就ok啦
如果輸入錯誤就報錯:warning : Failed to start to Java Virtual machine

6. 重啟matlab,敲入java.lang.Runtime.getRuntime.maxMemory
顯示最大記憶體改變,設定成功.

轉自:http://hi.baidu.com/albertleemon/blog/item/d66384089786d5c262d986c4.html

Matlab 的記憶體分配機制 2011年04月23日 星期六 下午 02:19 1、建立和修改陣列——基本思想是保持記憶體的連續性 (1)當為陣列賦值時,Matlab在記憶體中分配連續的虛擬塊,在另一個地方,將陣列的型別和維數等儲存為頭資訊。 (2)當向陣列增加新元素時,如果原來位置的連續記憶體區域可以容納新增加的資料,則擴大分配的記憶體,然後增加元素;如果連續塊不夠大,需要先重新分配能夠容納原有資料和新增資料的連續記憶體塊,再將原有資料拷貝到新分配的記憶體中(在此期間,記憶體中會有原來資料的兩份拷貝,增加了out of memory的風險),並新增新的元素到新的塊中,然後釋放原來的記憶體。 (3)當刪除陣列元素時,先移除元素,再壓縮原來分配的空間。

2、陣列的拷貝

(1)當將一個數組賦值給另一個變數時,不會為新變數分配記憶體,新變數只是到原來陣列的引用,直到新變數中元素值改變時,才會為其分配記憶體。 (2)通過引數傳遞給函式的資料,當資料內容發生改變時才會分配記憶體,函式內部新的資料通過返回值傳遞給呼叫該函式的函式。

3、陣列頭

(1)由於陣列頭佔據儲存空間(雖然不多),資料存放在幾個大陣列中要由於存放在多個小陣列中。 (2)對結構體和元胞(cell)陣列,Matlab不僅為他們建立頭資訊,還為結構體的每個欄位和元胞陣列的每個元素建立頭資訊,因此結構題和元胞陣列消耗的記憶體與其建立方式有關。 (3)whos函式只能檢視資料佔用的儲存空間,不會顯示頭資訊佔用的空間。

4、資料結構與記憶體

(1)8-bit、16-bit、32-bit、64-bit的有符號整型或無符號整型分別佔用1、2、4、8位元組空間,單精度、雙精度浮點數分別佔用4、8位元組空間。 (2)複數的實部和虛部分別佔用存貯空間,當修改實部或虛部時,會同時複製實部和虛部。 (3)當陣列的元素絕大部分為0時,用稀疏矩陣存貯以節省空間。

5、記憶體佔用計算

(1) 元胞陣列佔用的空間計算方法為:(header_size x number_of_cells) + data,對於64位系統,header_size為112,檢視header_size的方法: A = {[]}, whos A。A = {1 2 3}, A = {[1 2 3]}, A = {{1 2 3}}佔用的位元組數分別為:112×3+8×3,112×1+8×3,112×4+8×3。 (2)64bit系統中結構體佔用空間的計算方法:fields x ((112 x array elements) + 64) + data (32bit系統中將112改為60)。

轉自:http://hi.baidu.com/jiyeqian/blog/item/63f7222aa11fac8d023bf679.html