为什么我的matlab程序会使用这么多内存?

时间:2016-02-19 08:56:14

标签: matlab memory

我正在编写一个matlab程序,它读取大约500个文件。每个文件有20,000行,每行有1个数字。该程序尝试使用这些数字构建20,000 * 500的矩阵。 数字存储为Double,因此每个数字为8个字节。所以我希望这需要20,000 * 500 * 8字节,大约是1E8,即100MB。然而这个程序耗尽了我的16GB内存。随着程序的运行,我看到内存使用率稳步上升,GB为GB。我在Ubuntu 14.04上使用Matlab R2015b。

发生了什么?非常感谢你的关注。

这是完整的代码

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

2 个答案:

答案 0 :(得分:3)

经OP验证,Linux版Matlab 2015b中的str2num函数存在内存泄漏。此函数无论如何都不是很有用,因为它旨在解析表示整个矩阵(1 2; 3 4)的字符串,而不是解析单个数字(1.234)的典型用例。在进行简单数字解析时使用str2double;即使str2num未被破坏,它也会更快。

使用不同版本的Matlab可能也会解决这个问题,因为根据我的经验,这些类型的内存错误通常不会从一个版本持续到下一个版本。

答案 1 :(得分:1)

通常,高级I / O功能(例如dlmreadtextscan)对于阅读此类文本格式非常有用。如果您只有数字数据,请使用dlmread, 和textscan更复杂的格式。

您提供的样本数据是:

  

A2LD1|87769 135.5735

由于您只需要第二列中的数字并丢弃第一列中的标识符,您所拥有的只是数字数据,您可以使用dlmread

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

\t用于指定分隔符(列分隔符)是Tab。两个1用于指定行偏移量和列偏移量,即忽略文件的第一行(标题)和第一列(id)。