2010-01-27 37 views
2

我正在使用塊處理方法來處理兩個大矩陣之間的計算。MATLAB塊大小和內存管理

使用較大的塊大小時,代碼顯着加速。但是如果我太大了,那麼我會收到內存不足錯誤。目前我手動調整我的代碼以找到給定輸入的最大工作塊大小。

我的問題:如何自動化找到最大可能的塊大小的過程?

我已經玩弄了try/catch塊中的所有東西,並且逐漸更小的塊大小循環直到成功。我希望有更優雅或習慣的方式。

回答

8

在進行數據塊處理之前,可以使用MEMORY函數來查看已經使用了多少內存以及塊處理可能需要創建的額外變量的剩餘量。如果您可以估算塊處理步驟將需要的內存總量作爲塊大小的函數,則可以在耗盡可用內存之前確定塊大小有多大。這可能說起來容易做起來難,因爲我不知道你是如何做塊處理的。

下面是一個簡單的例子。我會通過清除工作區和創建2點大矩陣開始:

>> clear all 
>> mat1 = zeros(8000); %# An 8000-by-8000 matrix of doubles 
>> mat2 = zeros(8000); %# Another 8000-by-8000 matrix of doubles 

現在,讓我們說,我知道我將要分配一個N-by-N矩陣的雙打,這將需要8*N*N字節的內存(每雙8個字節)。我能做到以下幾點,找出我可以有多大使N

>> uV = memory %# Get the memory statistics 

uV = 

    MaxPossibleArrayBytes: 314990592 
    MemAvailableAllArrays: 643969024 
      MemUsedMATLAB: 1.2628e+009 

>> maxN = floor(sqrt(uV.MaxPossibleArrayBytes/8)) %# Compute the maximum N 

maxN = 

     6274 

>> mat3 = ones(maxN); %# Works fine 
>> mat3 = ones(maxN+1); %# Tanks! Too large! 
??? Out of memory. Type HELP MEMORY for your options. 

如果你經常有與運行內存麻煩,這裏有兩件事情可以做:

  • 對大矩陣使用single精度(或integer types)代替默認的double精度。
  • 一定要clear變量你不需要了(特別是如果它們很大)。
+0

由於這個問題是由最近的編輯,我想補充到這個優秀的總結:也可以使用'profiler'的'memory'選項。它允許查找一些函數需要分配多少額外內存來運行變量。這個[未公開](http://undocumentedmatlab.com/blog/undocumented-profiler-options)文章中的'memory'選項的詳細信息。 – Hoki 2015-05-08 15:00:21

+0

在Matlab2014b:'>> UV =存儲器 UV = MaxPossibleArrayBytes:59587694592 MemAvailableAllArrays:59587694592 MemUsedMATLAB:872325120 >> MAXN =地板(SQRT(uV.MaxPossibleArrayBytes/8)) MAXN = >> MAT3 = ones(maxN); 內存不足。爲您的選項鍵入HELP MEMORY。 >> mat3 = ones(maxN-100); 內存不足。鍵入幫助內存爲您的選項。「你會碰巧知道這種方法是版本還是系統特定的?有沒有可能指向我的修改? – Aaron 2017-03-09 18:21:59

+1

@Aaron:注意'MaxPossibleArrayBytes'等於'MemAvailableAllArrays',這意味着你只能分配1個這樣大小的矩陣(而沒有別的)。不過,'MemUsedMATLAB'顯示已經使用了大量內存*。首先清除所有其他數據,或者試試這個:uV = memory; maxN = floor(sqrt((uV.MaxPossibleArrayBytes-uV.MemUsedMATLAB)/ 8));'。 – gnovice 2017-03-09 18:29:14