Out of memory問題總結

來源:互聯網
上載者:User

首先,我要聲明,matlab
內建的
Help
才是最權威的
Matlab
學習資料,如果有時間好好學習一下或是可以高效的使用的話,一定受益匪淺!比如說像
Out of Memory
這個問題,最開始我都是用
Help memory
,幾乎得不到任何資訊;然後就是去網上搜尋此類問題的解決方案,一般有這幾種:

除了升級記憶體和升級
64
位系統外,下面幾個方法也是解決之道。




1>
增加虛擬記憶體

2>
採用
PACK
(在命令列輸入
pack
整理記憶體空間)

3>
採用
3GB
開關啟動系統
(
修改
c
盤根目錄
boot.ini
啟動選項加上
/3G



例如:



multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G

4>
最佳化程式,減少變數

(使用疏鬆陣列
sparse

save
儲存變數
load
變數,需要時再讀出來

5>


如果必有必要,不要啟動
java
虛擬機器,採用
matlab -nojvm
啟動

(在捷徑屬性裡面的
"..../matlab.exe"


改為(
"...../matlab.exe" - nojvm


6>
關閉
Matlab Server  

7>
使用

單精確度
single
短整數替代

雙精確度。






現在看來這些解決方案對於我的問題來說根本就是
“治標不治本”,不能解決實際問題,後來在一個師兄的提醒下
Help out of memory
,終於找到瞭解決此類問題的方法。在此感謝這位師兄啊!



重申
――
Matlab

Help
才是
Matlab
的最權威的指導材料!!!



其實我的所謂原創就是對
Help out of memory
的一些歸納總結而已,有興趣的話大家可以自己去看!!!



問題一:
Matlab
是如何儲存矩陣的


Matlab
中矩陣是以
Block
,也就是塊的形式儲存的。也就是說,當
Matlab
在為即將儲存的矩陣劃分塊時,如果沒有相應大小的連續記憶體,即使實際記憶體沒有被完全使用,他還是會報告

Out of Memory
”。



問題二:如何高效使用
Memory



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

Out of Memory
”。



1

為矩陣變數預製記憶體而不是動態分配

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



比較下面兩個程式:

for k = 2:1000

x(k) = x(k-1) + 5;
end



x = zeros(1, 1000);

for k = 2:1000



x(k) = x(k-1) + 5;
end






顯然,第二個更好!最好的方法是,在程式一開始就位所有大的矩陣變數預製存儲存單元!

Out of memory

問題總結【原創】(二)

1.盡量早的分配大的矩陣變數



Matlab
使用
heap method
管理記憶體。當在
Matlab heap
中沒有足夠的記憶體使用量時,它會向系統請求記憶體。但是只要記憶體片段可以存下當前的變數,
Matlab
會重新使用記憶體。

比如:

a = rand(1e6,1);

b = rand(1e6,1);


使用大約
15.4 MB RAM

c = rand(2.1e6,1);


  



使用近似
16.4 MB RAM:

a = rand(1e6,1);

b = rand(1e6,1);

clear

c = rand(2.1e6,1);







使用
32.4 MB RAM
。因為
Matlab
不能使用
a

b

clear
的空間,因為它們均小於
2.1 MB
,而同時它們也很可能是不連續的。



最好的方法:

c = rand(2.1e6,1);

clear

a = rand(1e6,1);

b = rand(1e6,1);


使用
16.4 MB RAM



2

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




3

盡量的重複使用變數(跟不用的
clear
掉一個意思)



4

將矩陣轉化成稀疏形式



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

例如:

1000
×
1000
的矩陣
X
,它
2/3
的元素為
0
,使用兩種儲存方法的比較:

Name
Size
Bytes
Class

X
1000x1000
8000000
double array

Y
1000x1000
4004000
double array (sparse)




5

使用
pack
命令



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



6

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



7

增大記憶體

問題三:
Increase the size of the swap file.

wap space
的設定與使用的作業系統有關,具體的如下:



1.UNIX
Information
about swap space can be procured by typing pstat -s at the UNIX command
prompt. For detailed information on changing swap space, ask your
system administrator.




2.Linux
Swap
space can be changed by using the mkswap and swapon commands. For more
information on the above commands, type man followed by the command name
at the
Linux prompt.





3.Windows NT
Follow
the steps shown here: Right-click the My Computer icon, and select
Properties. Select the Performance tab and click the Change button to
change the amount of virtual memory.




4.Windows 2000

右鍵
“我的電腦”-
>
屬性-
>
進階-
>
效能-
>
設定,從而改變其虛擬記憶體。



5.Windows XP

右鍵
“我的電腦”-
>
屬性-
>
進階-
>
效能-
>
設定,從而改變其虛擬記憶體。



問題四:盡量少時用系統資源(對於
Windows




Windows
中字型、視窗等都是要佔用系統資源的,所以在
Matlab
運行時盡量不要開啟不用的視窗。



問題五:
Reloading Variables on UNIX Systems



由於我不使用
UNIX
系統,這裡不介紹,直接從
Help
中粘過來

On
UNIX systems, MATLAB does not return memory to the operating system
even after variables have been cleared. This is due to the manner in
which UNIX manages memory. UNIX does not accept memory back from a
program until the program has terminated. So, the amount of memory used
in a MATLAB session is not returned to the operating system until you
exit MATLAB.
To free up the memory used in your MATLAB session, save
your workspace variables, exit MATLAB, and then load your variables
back in.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.