2013-12-12 73 views
1

我想知道如果我的建議,'內存不足'的問題是不可能的。這是我的建議:在Matlab中'內存不足'。一個緩慢但永久的解決方案?

這個想法是無縫地將巨大的矩陣(如BIG = rand(10^6))保存到HDD作爲.mat(-v7.3)文件,因爲它不可能保存在內存中並在需要時無縫調用它。然後,當你想用它喜歡:

a = BIG(3678,2222); 
s = size(BIG); 

,它無縫地做到這一點幕後:

m = matfile('BIG.m'); 
a = m.BIG(3678,2222); 
s = size(m,'BIG'); 

我知道,速度是重要的,但假設我有足夠的時間,但沒有足夠的內存。而且它更好地編寫一個高效的內存程序,但是又一次假設我需要使用其他人無法優化的函數。我確實有更多相關的問題:這可以用對象來實現嗎?還是需要在Matlab中進行基礎結構更改?

+0

可能相關http://askubuntu.com/q/799834/25388 –

回答

4

對我來說這似乎是可能的,因爲這基本上是許多操作系統以paging的形式所做的。此外,類似的東西由MATLAB分佈式計算服務器提供。這允許您(除其他外)將單個矩陣的數據存儲在多臺機器上,並按照您的建議方式無縫訪問它。

恕我直言,允許數據被分頁到文件/交換應該是在MATLAB中的設置。不幸的是,這並不是MATLAB的內存模型的工作原理,我懷疑它是很難實現這一點的。此外,啓用此設置後,用戶將不再受到保護,不會再犯zeros(1e7)這樣的愚蠢錯誤,而不是zeros(1e7,1);它似乎會掛起系統,因爲MATLAB忙於用零填充整個驅動器。

無論如何,我認爲它是可能使用MATLAB類。但我不會推薦它。請注意,實施適當的subsrefsubsasgn是* ahum * 挑戰,再加上,很可能你將不得不重新實現許多算法(如mldivide)。這很可能意味着你會失去很多的表現;考慮數千人的因素。

這裏有一個有趣的random relevant paper我在google搜索時發現了一下。

+0

如果您可以提供有關錯誤處理的任何代碼示例,那將是非常好的。我的主題是http://askubuntu.com/q/799834/25388 –

0

寫一個函數:

function a=BIG(x,y) 
    m = matfile('BIG.mat'); 
    a = m.BIG(x,y); 
end 

每次你寫BIG(a,b)函數被調用。

2

什麼可能是你的問題的解決方案是內存映射io(matlab支持)。

有一個文件映射到內存,並且對該內存地址的所有讀取/寫入實際上是對文件的讀取/寫入。

這隻保留/阻止內存地址,它不佔用物理內存。然而,我只會建議它與64位的matlab,因爲32位matlab的地址空間是不夠大,使用ram數據,matlab和dll代碼,和內存映射io。

檢查出的memmapfile()文檔頁的實施例中,例如,

m = memmapfile('records.dat', ... 
      'Offset', 1024, ... 
      'Format', {'uint32' [4 10 18] 'x'}); 

A = m.Data(1).x; 

whos A 
    Name  Size      Bytes Class 

    A  4x10x18     2880 uint32 array 

。注意,訪問m.Data(1).x重定向到文件IO,即無記憶被消耗。因此它可以高效地隨機訪問駐留在磁盤上的可能非常大的數據文件的一部分。還要注意,可以實現像例子中那樣更復雜的數據結構。

在我看來,這提供了「你想要的對象的實現」。

不幸的是,這不允許memmap MATfiles直接,這將是非常有用的。可能這是因爲壓縮造成的。