如何在 GNU Octave 中加速读取大文件?

How do I accelerate reading large files in GNU Octave?

我正在将一个大型 CSV 文件导入 GNU Octave,进行一些简单的数据操作并创建一些绘图。该文件有大约 650 万行。我预计文件读取过程大约需要两到三个小时,因为根据我的经验,创建这种大小的文件通常需要多长时间。添加了一个状态计数器,当它没有完成时发现它在读取时变慢了; 12 小时后,仅在 150 万条线上爬行。不过,根据资源监视器,没有内存问题。有没有比我下面的方法更有效的阅读代码的方法?我是否需要做一些特别的事情来为进程分配内存,这样它就不会变慢?这是在 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

这是慢的部分:

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

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

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