如何加快逐行读取ASCII文件的速度?(C++)

Jon*_*Jon 11 c++ optimization file-io ifstream

这里有一些代码,在做了一些测量之后是一个相当大的瓶颈:

//-----------------------------------------------------------------------------
//  Construct dictionary hash set from dictionary file
//-----------------------------------------------------------------------------
void constructDictionary(unordered_set<string> &dict)
{
    ifstream wordListFile;
    wordListFile.open("dictionary.txt");

    std::string word;
    while( wordListFile >> word )
    {
        if( !word.empty() )
        {
            dict.insert(word);
        }
    }

    wordListFile.close();
}
Run Code Online (Sandbox Code Playgroud)

我正在读大约200,000字,这在我的机器上大约需要240毫秒.ifstream这里使用效率高吗?我可以做得更好吗?我正在阅读有关mmap()实现的内容,但我并不是100%理解它们.输入文件只是带有*nix行终止的文本字符串.

编辑:建议替代方案的后续问题:任何替代方案(减去增加流缓冲区大小)是否意味着我编写了一个解析每个字符的解析器?我有点像流的简单语法,但如果我需要速度,我可以重新写一些更细节的东西.将整个文件读入内存是一个可行的选择,它只有2mb左右.

编辑#2: 我发现对我的减速是由于设置插入,但对于那些仍然有兴趣加快逐行文件IO的人,请在这里阅读答案并查看Matthieu M.的关于这个主题的继续.

Cub*_*bbi 8

在我的系统上快速分析(linux-2.6.37,gcc-4.5.2,用-O3编译)表明I/O不是瓶颈.无论是使用fscanfchar数组后跟dict.insert()还是operator>>在你的确切代码中,它都需要大约相同的时间(读取240k字文件需要155-160 ms).

更换gcc的std::unordered_setstd::vector<std::string>在你的代码下降执行时间45毫秒(fscanf) - 55毫秒(operator>>)对我来说.尝试分析IO并分别设置插入.


归档时间:

查看次数:

6664 次

最近记录:

5 年,11 月 前