【问题标题】:A solution for "out of memory" error in matlabmatlab中“内存不足”错误的解决方法
【发布时间】:2019-04-25 22:10:28
【问题描述】:

我有一个非常大的文本文件(大约 11GB)需要在 matlab 中加载。但是当我使用“textread”功能时,出现“内存不足”错误。没有办法减小文件大小.当我输入记忆时,给我看。

memory
Maximum possible array:     24000 MB (2.517e+10 bytes) *
Memory available for all arrays:     24000 MB (2.517e+10 bytes) *
Memory used by MATLAB:      1113 MB (1.167e+09 bytes)
Physical Memory (RAM):     16065 MB (1.684e+10 bytes)

*  Limited by System Memory (physical + swap file) available.

有没有人能解决这个问题?

【问题讨论】:

  • 您可以尝试阅读文件line by line。文本文件中有什么样的数据,你想用它做什么?
  • 我猜买更多的内存....
  • @Ander 您需要开始从 Corsair 获得推荐 $$$,以便一致地“购买更多 RAM”评论“内存不足”问题!
  • @rinkert 它是 txt 文件中带有 XYZRGB 列的点云,我需要在其中添加另一列。如何逐行阅读?
  • @Wolfie 还有什么其他解决方案......如果需要整个变量并且它不适合内存,那就是解决方案......否则,重组整个代码也可以。我应该联系海盗船:P

标签: matlab out-of-memory


【解决方案1】:

@Anthony 建议了一种逐行读取文件的方法,这非常好,但最近 (>=R2014b) 版本的 MATLAB 具有 datastore 功能,旨在处理大块数据文件.

有几种类型的datastore 可用,具体取决于您的文本文件格式。在最简单的情况下(例如 CSV 文件),自动检测效果很好,您可以简单地说

ds = datastore('myCsvFile.csv');
while hasdata(ds)
    chunkOfData = read(ds);
    ... compute with chunkOfData ...
end

在最新 (>=R2016b) 版本的 MATLAB 中,您可以更进一步,将 datastore 包装到 tall 数组中。 tall 数组可让您对太大而无法一次全部放入内存的数据进行操作。 (在幕后,tall 数组以块的形式执行计算,并且只有在您通过调用gather 请求它们时才给您结果)。例如:

tt = tall(datastore('myCsvFile.csv'));
data = tt.SomeVariable;
result = gather(mean(data)); % Trigger tall array evaluation

【讨论】:

    【解决方案2】:

    根据您对代码用途的说明:

    它是 txt 文件中带有 XYZRGB 列的点云,我需要在其中添加另一列。

    我建议您一次读取文本文件一行,修改该行并将修改后的行直接写入一个新的文本文件。

    一次读一行:

    % Open file for reading.
    fid = fopen(filename, 'r');
    
    % Get the first line.
    line = fgetl(fid);
    while ~isnumeric(line)
        % Do something.
    
        % get the next line
        line = fgetl(fid);
    end
    fclose(fid);
    

    要写行,你可以使用fprintf

    这是一个演示:

    filename = 'myfile.txt';
    filename_new = 'myfile_new.txt';
    
    fid = fopen(filename);
    fid_new = fopen(filename_new,'w+');
    line = fgetl(fid);
    while ~isnumeric(line)
        % Make sure you add \r\n at the end of the string; 
        % otherwise, your text file will become a one liner.
        fprintf(fid_new, '%s %s\r\n', line, 'new column');
        line = fgetl(fid);
    end
    fclose(fid);
    fclose(fid_new);
    

    【讨论】:

    • 谢谢,我也测试了这段代码,但是在“while”循环中也发生了内存不足。
    • @shima 这听起来很奇怪,因为while 循环中没有任何东西将大数据发送到内存。在您的测试代码中,您是否在循环中添加了一些其他代码?
    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2013-11-26
    • 2015-06-26
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多