2012-02-03 49 views
9

我有一個矩陣形式的大型MATLAB文件(150MB)(即4070x4070)。我需要在MATLAB中處理這個文件,但我似乎無法加載這個文件。我收到「內存不足」錯誤。有沒有其他的方式可以加載這個文件的大小?我正在使用32位處理器,並具有2GB的RAM。請幫助我,我處理這個問題已經筋疲力盡了。如何在MATLAB中加載大文件(〜150MB)?

+4

它是* .mat文件格式,或其他格式? – hatboyzero 2012-02-03 19:05:50

+1

我非常驚訝一個150MB的文件可以在打開時填滿2GB的內存!在嘗試裝載之前,您的機器有多少可用內存?還有其他可以關閉的程序嗎? – japreiss 2012-02-03 19:20:23

+0

如果這是一個.mat文件,'whos -file '也會導致問題,或者只是'load'?如果它不是.mat文件,是否有標題文本? – 2012-02-03 21:22:24

回答

3

如果它是一個圖像文件,並且您想使用它,請嘗試使用matlab block processing。通過使用它,你將加載文件的一小部分。您的功能fun將分別應用於每個塊。

B = blockproc(src_filename,[M N],fun) 

如果它是一個xml文件,一起嘗試XML DOM Node模式SAX - (感謝@Nzbuu指出了這一點),但是,這似乎是一個未公開的功能。

此外,如果它是任何類型的文本文件(不太可能,由於數據量),請嘗試使用外部工具進行拆分。

+1

XML DOM首先將整個文件讀入內存,這樣在這裏不會有幫助; SAX流式傳輸XML並引發事件來處理數據。另外,我發現在MATLAB中處理DOM對象的速度很慢。 – Nzbuu 2012-02-03 19:15:39

+0

@Nzbuu,謝謝。出於某種原因,我通過Matlab總是使用SAX。快速谷歌搜索顯示你是正確的。 – 2012-02-03 19:40:09

+0

我認爲它使用SAX來創建一個DOM樹。 – Nzbuu 2012-02-03 20:16:00

11

Starting從版本R2011b(版本7.13)開始,有一個新對象matlab.io.MatFileMATFILE作爲構造函數。它允許加載和保存MAT文件中的部分變量。有關更多詳情,請參閱文檔。下面是一個簡單的例子來讀取一個矩陣的一部分:

matObj = matfile(filename); 
a = matObj.a(100:500, 200:600); 

如果您的原始文件不是MAT文件,但一些文本文件,可以部分地理解它,並使用matfile這些零件保存到同一個變量在MAT文件中供以後訪問。只記得在構造函數中將Writable屬性設置爲true。

假設你的文本文件是製表符分隔,並且只包含數字,這裏是一個示例腳本讀取塊中的數據,並將它們保存到MAT文件:

blocksize = 100; 
startrow = 0; 
filename = 'test.mat'; 
matObj = matfile(filename,'Writable',true); 
while true 
    try 
     a = dlmread(filename,'\t',startrow,0); %# depends on your file format 
     startrow = startrow + blocksize; 
     matObj.a(startrow+(1:blocksize),:) = a; 
    catch 
     break 
    end 
end 

我沒有最新版本現在來測試,但希望它能工作。

1

您也可以用戶MATLAB的Memory-Mapping of Data Files在文件塊,並處理讀取,然後繼續下一個塊,而無需將整個文件加載到內存中一次

例如,請參閱this example,其中「將100個雙精度浮點數的文件映射到內存」。

+0

在早期版本中,當它剛剛出現在MATLAB中時,我嘗試了這個對象。有趣的是,MATLAB不得不將整個文件加載到內存中。我聯繫了Mathworks的支持人員,他們證實了這一點。他們基本上將這個功能推廣爲能夠同時在不同應用程序之間共享數據的功能。那麼,看起來事情已經改變了。我已經使用R2011a再次嘗試過,memmapfile對象只佔用300b。很好的答案。 +1。該文件必須具有該對象的常規結構(僅適用於二進制?),因此無論如何輸入文件可能需要重新格式化。 – yuk 2012-02-06 18:55:24

相關問題