我正在逐行读取文件,并从中提取整数。一些值得注意的点:
- 输入文件不是二进制文件;
- 我无法将整个文件加载到内存中;
文件格式(仅整数,由一些分隔符分隔):
x1 x2 x3 x4 ... y1 y2 y3 ... z1 z2 z3 z4 z5 ... ...
只是为了添加 context,我正在读取整数,并使用std::unordered_map<unsigned int, unsinged int>
.
简单地遍历行,并分配无用的字符串流,如下所示:
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
}
一个 700MB 的文件给我大约 2.7 秒。
解析每一行:
unsigned int item;
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
while (ss >> item);
}
给我约 17.8 秒的同一个文件。
如果我将运算符更改为std::getline
+ atoi
:
unsigned int item;
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
while (std::getline(ss, token, ' ')) item = atoi(token.c_str());
}
它给出了~14.6s。
有什么比这些方法更快的吗?我认为没有必要加快文件读取速度,只是解析本身 - 两者都不会造成任何伤害,但(: