我有以下关于大型文本文件输入(~500k 行)和后续数据解析的性能问题。
考虑data.txt
具有以下示例性结构的文本文件,其特点是两个标题行可以重新出现在文本文件的某处:
Name Date Val1 val2
--- ------- ---- ----
BA 2013-09-07 123.123 1232.22
BA 2013-09-08 435.65756 2314.34
BA 2013-09-09 234.2342 21342.342
我编写并且正在运行的代码如下:
%# Read in file using textscan, read all values as string
inFile = fopen('data.txt','r');
DATA = textscan(inFile, '%s %s %s %s');
fclose(inFile);
%# Remove the header lines everywhere in DATA:
%# Search indices of the first entry in first cell, i.e. 'Name', and remove
%# all lines corresponding to those indices
[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1)));
for i=1:length(DATA)
DATA{i}(iHeader)=[];
end
%# Repeat again, the first entry corresponds now to '---'
[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1)));
for i=1:length(DATA)
DATA{i}(iHeader)=[];
end
%# Now convert the cells for column Val1 and Val2 in data.txt to doubles
%# since they have been read in as strings:
for i=3:4
[A] = cellfun(@str2double,DATA{i});
DATA{i} = A;
end
我选择将所有内容作为字符串读取,以便能够删除DATA
.
停止时间告诉我,代码中最慢的部分是转换,[A] = cellfun(@str2double,DATA{i})
尽管str2double
与str2num
. 第二个最慢的部分是textscan
.
现在的问题是,有没有更快的方法来处理这个问题?
请让我知道我是否应该进一步澄清。如果有一个我没有看到的非常明显的解决方案,请原谅我,我现在才使用 Matlab 工作了三周。