解析文件的快捷方式?

时间:2012-03-09 00:34:41

标签: c++ file optimization fstream

我正在写一个应该读取最常见图形格式的图形库。一种格式包含以下信息:

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函数?

2 个答案:

答案 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库的调用。读取整个文件几乎消除了所有这些调用。

相关问题