【发布时间】: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