matlab经常out of memory 如何解决?

浏览:564667 回答:4
最近运行大的矩阵运算,经常出现out of memory

看到不少网页介绍,
如果 采用clear 清空空间,还有加大虚拟内存 都是部分解决问题

还有网友推荐 清空内存命令pack,还有别的网友说要用fortran编程解决,

希望大家有更好的方法,贴出来讨论一下!

邀请回答 我来回答

全部回答

(4)
默认 最新
求知者
改进算法也是一个方面,比如不要在循环中重复生成一个维数不断增大的数组或矩阵
2006年9月21日
评论 点赞
IF_THEN

楼上的资料,漂亮!

2006年9月20日
评论 点赞
amesim









































































































利用MATLAB 7之新功能處理大量資料集(下)

鈦思科技股份有限公司
企劃部專員 黃忻 譯




資料存取
讀取純文字檔
新增的 textscan 函式方便您存取任何格式的大型文字檔案。此函式之功能類似於 textread 函式,但加入了指定檔案尋找工具 (file identifier) 之功能,方便使用者在檔案中追蹤及橫越任一檔案指標 (pointer) 。因此您可以一次讀取檔案中的一個區塊,或在不同情況下更改檔案格式。

舉例來說,假設有個文字檔案 - test12_80211b.txt,其中包含數個不同大小的資料區塊,每個區塊的格式如下:

- 兩個標頭敘述
- 一個參數 m
- 一個維度為p x m 的資料表格

下面是檔案test12_80211b.txt的顯示:
* Mobile1
* SNR Vs test No
Num tests=19
,-5.00E+00,-4.00E+00,-3.00E+00,-2.00E+00,...
1.00E+00,6.19E-07,8.63E-07,6.43E-07,1.84E-07,...
2.00E+00,2.88E-07,4.71E-07,6.92E-07,1.43E-07,...
3.00E+00,2.52E-07,8.11E-07,4.74E-07,8.48E-07,...
4.00E+00,...
...

* Mobile2
* SNR Vs test No
Num tests=20
,-5.00E+00,-4.00E+00,-3.00E+00,-2.00E+00,-1.00E+00,0.00E+00,...
1.00E+00,6.19E-07,8.63E-07,6.43E-07,1.84E-07,6.86E-07,3.73E-,...
2.00E+00,...
您可以使用以下指令以讀入檔案:
fid = fopen('test12_80211b.txt', 'r'); % Open text file
InputText = textscan(fid, '%s', 2, 'delimiter', '\n'); % Read header lines
HeaderLines = InputText{1}
HeaderLines =
'* Mobile1'
'* SNR Vs test No'
InputText = textscan(fid, 'Num tests=%f'); % Read parameter value
NumCols=InputText{1}
NumCols =
19
InputText=textscan(fid, '%f', 'delimiter', ',' ); % Read data block
Data=reshape(InputText{1},[],NumCols)';
format short g
Section=Data(1:5,1:5)
Section =

































NaN

-5

-4

-3

-2

1

6.19e-007

8.63e-007

6.43e-007

1.84e-007

2

2.88e-007

4.71e-007

6.92e-007

1.43e-007

3

2.52e-007

8.11e-007

4.74e-007

8.48e-007

4

1.97e-007

1.64e-007

1.38e-007

6.17e-007
在提昇的資料存取速度上,新版MATLAB中讀取comma-separated-value (CSV)檔案的速度可比過去快上一個數量級(order of magnitude)。
MAT檔案壓縮
MATLAB 7 中的 save 指令會在將MAT檔案寫入到磁碟之前先行壓縮,使得可壓縮 (非隨機) 的資料集佔用更少空間,同時透過網路讀取大型資料檔案之速度亦顯著提昇。
資料儲存效率
新版的MATLAB 7 可支援整數及單精準度數學運算。這項新功能使您能夠在整數及單精準度資料之原始型態下進行處理,使得記憶體的使用更具效率,且可以處理更大型的非整數資料集。

舉例來說,您可以處理比過去(以雙精準度型態儲存時)多8倍的8-bit整數值。所以在Windows XP平台上(未使用3-GB轉換設定時),過去一律將資料儲存為雙精準度型態時的檔案大小限制為180 MB,而您現在可讀入大小達1.5 GB的8-bit整數值檔案 (註:此為理論上的檔案大小極限,且將會沒有多餘空間可進行運算並儲存結果)。詳細資訊可參考技術專題- 以MATLAB進行整數及單精準度數學運算
資料處理效能
提昇的執行速度
MATLAB 7 在處理大型資料集問題方面有多項處理速度的功能提昇。包括由處理器廠商提供,在多數平台版本的MATLAB下均有支援之最佳化Basic Linear Algebra Subprograms(BLAS)函式庫,如:Intel® Math Kernel Library (MKL)AMD Core Math Library (ACML)、及可由Macintosh的Accelerate framework取得的BLAS函式庫等。同時,亦採用最新版本的FFTW (3.0)常式以將FFT相關工作之執行速度極大化。

JIT(Just-In-Time)加速器現在適用於所有數值資料型態,如複數變數及函式呼叫等,提昇更廣範圍MATLAB語言之速度。它同時產生MMX指引以將整數運算之執行最佳化。在處理8-bit整數時,可以使執行速度達雙精準度資料之八倍快。
全新的大型資料集處理功能
其餘新增支援大型資料集處理的功能包括:
- 進行互動式資料分析時可以在陣列編輯器(array editor)中檢視更大筆的數值陣列 (最多達500,000個元素)

- 巢狀函式現在允許您在內部函式中看到主函式的變數空間(workspace)。這項新功能使您可以在函式間(如在GUI中)共享大型資料集,而不需採用公用(global)變數或將資料以函式參數值之方式傳遞。在下面的範例中,巢狀函式process可以在主函式percentNonzero的變數空間中看到變數如:street1等。
function y = percentNonzero(filename, scalevalue, thresholdvalue)
%PERCENTNONZERO Calculate the percentage of non-zero elements
% P = PERCENTNONZERO('FILENAME', SCALEVALUE, THRESHOLDVALUE)
% returns the percentage of non-zero elements in an image read
% from the file FILENAME, scaled by the value SCALEVALUE and
% thresholded at a value of THRESHOLDVALUE.
%
% Example:
% p=percentNonzero('street1.jpg',1.5,140);

street1 = imread(filename); % Read image from file
process(scalevalue, thresholdvalue); % Scale and threshold image

% Find percentage of non-zero elements
y = 100 * sum(street1(:))/numel(street1);

function process(scaleval, threshval)
% Scale image
street1 = street1 * scaleval;

% Threshold image to create logical array
street1 = street1 > threshval;
end
end
- 全新的M-Lint程式碼檢查器(M-Lint Code Checker)會自動偵測並回報程式中未使用的變數,使您可以將其移除以將記憶體用量減到最小。
總結
MATLAB 7中包含了許多全新工具及功能以協助您處理大型資料集,使您能夠挑戰更大且更複雜的工程及科學問題,並在更短的時間內將問題解決。
2006年9月20日
评论 点赞
amesim











































利用MATLAB 7之新功能處理大量資料集(上)

鈦思科技股份有限公司
企劃部專員 黃忻 譯




最新版的MATLAB 7包含了許多新增或升級功能,以支援大量資料集之處理工作,提昇功能包括:檔案存取功能、資料儲存效率、資料處理速度及新增對64位元平台之支援等。

本文中的內容及範例使用的是MATLAB產品家族最新版Release 14 SP1中的產品及功能。
大量資料集之處理問題
想解決需要處理及分析大量資料的科學運算問題往往會佔去電腦系統的大量資源。大量資料集在處理時會佔據極可觀的記憶體,且可能需要許多運算以求出結果。由大量資料集存取資訊往往也需要花費很長的時間。

然而,電腦系統的記憶體容量及CPU運算速度都是有限的。可用資源的多寡取決於使用的處理器及作業系統,同時作業系統本身也需消耗資源。舉例來說:

- 32位元的處理器及作業系統最多可以使用2^32 = 4,294,967,296 = 4 GB之記憶體 (即虛擬位址)

- Windows XP及Windows 2000只分配給每項工作(如:MATLAB)2 GB之虛擬記憶體。在UNIX系統上,每項工作所分配到的虛擬記憶體是可以自行調整的,一般是3 GB。

- 實際進行運算的應用程式,如MATLAB,可能需要儲存使用者進行工作以外的資料。

處理大量資料集時遇到的最主要問題在於應用程式需求的記憶體可能超過作業平台所提供的容量。在Window XP平台上,當MATLAB需求的資料處理容量超過約1.7 GB時,MATLAB便自動產生一個「out of memory」的警告訊息。

以下將介紹MATLAB 7中可用來協助使用者解決大量資料處理的升級或全新功能,包括增加可用的記憶體、改善檔案存取、更為有效率的資料儲存方法,及提昇的處理效能等。
將可用記憶體資源極大化
全新的64位元平台
可支援64位元平台的MATLAB版本已經正式上市,目前已提供基於AMD64及Intel EM64T處理器的Linux平台。64位元處理器提供非常大量的記憶體空間,最高可儲存2^64 bytes = 18,446,744,073,709,552, 000 bytes (16 exabytes)的資料。例如知名的Google搜尋引擎目前使用2 petabytes的磁碟空間。若有16 exabytes的空間,您可以在記憶體中儲存9,000個Google。

64位元架構的平台解決了處理大量資料集時所面臨的記憶體容量限制問題,但仍然沒有改善其他問題,如:執行速度及檔案存取等。

註:在MATLAB64位元版本下,單一矩陣的大小限制為2^32個元素如:一個65,000 x 65,000的矩陣,容量約為16 GB。
針對Windows XP記憶體用量問題的功能強化
新版的MATLAB 7在Windows XP上執行時,將最大鄰接記憶體區塊的容量增加至約1.5 GB,約相當於1億八千萬個雙精度值。

同時,MATLAB在Windows XP上現在可支援3 GB轉換的啟動選項,以額外分配1 GB的可用記憶體至每個運算工作。這種做法可將您能夠儲存在MATLAB workspace下的資料總量增加到約2.7 GB,約相當於三億三千萬個雙精度值。這個額外的記憶體區塊並沒有與其他MATLAB可使用的記憶體相鄰接,因此您沒有辦法建立一整個單一陣列並儲存在這個空間中。
檢視可用的記憶體
若想在MATLAB 7環境中檢視可用的記憶體,您可以利用下列指令:
>> feature('memstats')
下面這個範例呈現的是用一台1.2 GB RAM的電腦在Windows XP系統下,並使用3 GB轉換設定的結果。您可以看到兩個各超過1 GB的記憶體區塊,加總起來共有2.7 GB的記憶體可用。































































































Physical Memory (RAM):
In Use:
340 MB

(1549f000)
Free:
938 MB

(3aa4d000)
Total:
1278 MB

(4feec000)
Page File (Swap space):
In Use:
236 MB

(0ec78000)
Free:
986 MB

(3dad9000)
Total:
1223 MB

(4c751000)
Virtual Memory (Address Space):
In Use:
296 MB

(1283d000)
Free:
2775 MB

(ad7a3000)
Total:
3071 MB

(bffe0000)
Largest Contiguous Free Blocks:
1. [at 10007000]
1546 MB

(60a69000)
2. [at 7ffe1000]
1023 MB

(3ffbf000)
3. [at 7c41b000]
28 MB

(01c75000)
4. [at 74764000]
28 MB

(01c2c000)
5. ...

========

==========


2734 MB

(aae1a000)
您必須配備足夠的實體記憶體(RAM) 以滿足您的資料儲存需求。這樣的方法可減少將資料搬移至硬碟的次數/頻率,降低對執行效率之負面影響。

您可以參閱美國The MathWorks原廠網站所提供的Memory Management Guide 以獲得更多關於在MATLAB下極大化可用記憶體的資訊。
2006年9月20日
评论 点赞

没解决?试试专家一对一服务

换一批
    App下载
    技术邻APP
    工程师必备
    • 项目客服
    • 培训客服
    • 平台客服

    TOP