【问题标题】:How do I accelerate reading large files in GNU Octave?如何在 GNU Octave 中加速读取大文件?
【发布时间】:2020-10-10 15:35:04
【问题描述】:

我正在将一个大型 CSV 文件导入 GNU Octave,进行一些简单的数据操作并创建一些绘图。该文件有大约 650 万行。我预计文件读取过程大约需要两到三个小时,因为根据我的经验,创建这种大小的文件通常需要多长时间。添加了一个状态计数器,当它没有完成时,发现它在阅读时变慢了; 12 小时后,仅在 150 万行并在爬行。不过,根据 Resource Monitor 的说法,没有内存问题。有没有比我下面的更有效的方法来阅读代码?我是否需要做一些特别的事情来为进程分配内存,这样它就不会变慢?这是在 CSV 中读取的循环。这是一个 while 循环,一次扫描 csv 一行,提取我需要的列并在到达第一个空行时结束:

% Process File
  F=1;
  while 1
    % Status Counter
        printf ("Status: %d \r", F);
        fflush (stdout);
        F=F+1;
    % Read first unread line
        line = fgetl(fileID);
    % Exit while loop if line is empty
        if ~ischar(line)
          break;
        endif
    % Translate Line
        Bank = textscan (line, '%f',  'Delimiter', ',');
        Bank = cell2mat (Bank);
        Bank = transpose (Bank);
    % Append Bank to Output
      Output = [Output; Bank(1, 1:9), Bank(1, 13:14), Bank(1, 20:21)];
  endwhile

【问题讨论】:

  • 文件结构?标头与否?使用 dlmread octave.org/doc/v5.2.0/Simple-File-I_002fO.html#XREFdlmread 有什么问题?
  • @matzeri 我习惯了这种方式,因为我处理了很多不规则的文件,但是这个文件只是数字,没有标题行,并且每个文件的条目数一致排。但是,dlm 读取会更快吗?我认为这是一组非常简单的说明。如果这也没有帮助,我会尝试并添加注释。
  • 这是一个循环,根据定义循环在解释语言上很慢
  • @matzeri 无法标记为答案,但这工作得更好。谢谢。
  • @TonyBullard,不过,请务必注意下面 Chris 的回答。如果没有重复复制/附加,您的原始代码很可能是可以容忍的。如果您有非数字代码并且需要在 dlmread 不起作用的情况下执行此操作,那将很重要。

标签: csv octave large-files


【解决方案1】:

这是慢的部分:

Output = [Output; Bank(1, 1:9), Bank(1, 13:14), Bank(1, 20:21)];

您在这里所做的是创建一个新矩阵,将Output 和新行复制到其中,并将其分配给Output。随着Output 变大,副本变得越来越昂贵。

您需要做的是预先分配输出数组。总是预先分配!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多