如何在 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
变大,副本变得越来越昂贵。
您需要做的是预先分配输出数组。始终预分配!
我正在将一个大型 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
变大,副本变得越来越昂贵。
您需要做的是预先分配输出数组。始终预分配!