我正在写一个应该读取最常见图形格式的图形库。一种格式包含以下信息:
e 4 3
e 2 2
e 6 2
e 3 2
e 1 2
....
我想解析这些行。我查看了stackoverflow,可以找到neat solution来执行此操作。我目前使用这样的方法(文件是一个fstream):
string line;
while(getline(file, line)) {
if(!line.length()) continue; //skip empty lines
stringstream parseline = stringstream(line);
char identifier;
parseline >> identifier; //Lese das erste zeichen
if(identifier == 'e') {
int n, m;
parseline >> n;
parseline >> m;
foo(n,m) //Here i handle the input
}
}
它的效果非常好,而且正如预期的那样,但今天当我使用巨大的图形文件(50 mb +)进行测试时,我感到震惊的是,这个功能是整个程序中最糟糕的瓶颈:
我用来解析行的字符串流几乎占总运行时间的70%,而getline命令占25%。该计划的其余部分仅使用5%。
有没有快速的方法来读取那些大文件,可能避免慢字符串流和getline函数?
答案 0 :(得分:3)
您可以跳过双缓冲字符串,跳过解析单个字符,并使用strtoll
解析整数,如下所示:
string line;
while(getline(file, line)) {
if(!line.length()) continue; //skip empty lines
if (line[0] == 'e') {
char *ptr;
int n = strtoll(line.c_str()+2, &ptr, 10);
int m = strtoll(ptr+1, &ptr, 10);
foo(n,m) //Here i handle the input
}
}
在C ++中,strtoll
应位于<cstdlib>
包含文件中。
答案 1 :(得分:1)
mmap该文件并将其作为一个大缓冲区处理。
如果系统缺少mmap,您可以尝试将read
文件放入malloc
基本原理:大部分时间是从用户到系统的过渡,然后是对C库的调用。读取整个文件几乎消除了所有这些调用。