2016-02-19 105 views
6

我在寫一個讀取大約500個文件的matlab程序。每個文件有20,000行,每行有1個數字。該程序試圖用這些數字構建20,000 * 500的矩陣。 數字以雙精度存儲,因此每個數字爲8個字節。所以我預計這需要20,000 * 500 * 8個字節,大約是1E8,即100MB。然而這個程序耗盡了我的16GB內存。程序運行時,我看到內存使用量穩步上升,GB按GB增長。我在Ubuntu 14.04上使用Matlab R2015b。爲什麼我的matlab程序使用這麼多的內存?

發生了什麼事?非常感謝您的關注。

下面是完整的代碼

clear all; 
% number of rna bits in the file 
filesize = 20532 

maxFiles = 480; 
rnaCounts = NaN(filesize,maxFiles); 

myFolder = '~/_STATS/data3/RNASeqV2/UNC__IlluminaHiSeq_RNASeqV2/Level_3'; 
filePattern = fullfile(myFolder, '*genes.normalized_results'); 

theFiles = dir(filePattern); 

rnaCounts = NaN(filesize,length(theFiles)); 


for k = 1 : length(theFiles) 
    mrnaFilename = strtrim(theFiles(k).name); 
    fprintf(1, 'Now reading mrnaFile %d %s \n', k, mrnaFilename); 

    % read rna file 
    fullFileName = fullfile(myFolder, mrnaFilename); 
    rnafid = fopen(fullFileName); 

    if rnafid < 0 
     fprintf('====ERROR OPENING RNA FILE ====================='); 
    end 
    rnaline = fgets(rnafid); 

    lc = 1; % line counter 
    while ischar(rnaline) && feof(rnafid) ~= 1 
     rnaline = fgets(rnafid); 
     rnaSplit = strsplit(rnaline); 

     % write to the matrix 
     rnaCounts(lc,k) = str2num(rnaSplit{2}); 

     lc = lc + 1; 
    end 
    fclose(rnafid); 

end 
+0

要嘗試的一件事是刪除第一個'rnaCounts'實例;它沒有用,也很大,儘管這不應該是把內存吹起來的東西。 – drhagen

+0

另外,請嘗試'str2double'而不是'str2num'。那不是'str2num'的意思。 'help str2num'和'help str2double' – drhagen

+0

你確定內存是被Matlab保存的,而不僅僅是文件系統緩存嗎?例如如果你殺了Matlab,所有的內存立即清除? – drhagen

回答

3

經覈實由OP,在Linux版本的Matlab的2015B的str2num函數有內存泄漏。無論如何,這個函數並不是非常有用,因爲它被設計爲解析表示整個矩陣的字符串(1 2; 3 4),而不是解析單個數字(1.234)的典型用例。進行簡單的數字解析時使用str2double;即使str2num沒有損壞,速度也會更快。

使用不同版本的Matlab也有可能解決這個問題,因爲根據我的經驗,這些類型的內存錯誤通常不會從一個版本持續到下一個版本。

1

通常,高級I/O函數(如dlmreadtextscan)對於讀取此類文本格式非常有用。如果您只有數字數據, 和textscan以使用更復雜的格式,請使用dlmread

你提供的樣本數據是:

A2LD1|87769 135.5735

正如你只需要在第二列中的數字和在第一列中丟棄標識,你已經是數字數據,您可以使用dlmread

data = dlmread(fullFileName, '\t', 1, 1); 

\t用於指定分隔符(列分隔符)是Tab。兩個1用於指定行偏移量和列偏移量,即忽略文件的第一行(標題)和第一列(id)。

+0

謝謝,我會盡力的。 –

相關問題