C++逐行读取文本,需要节省速度/效率

C++ read text line-by-line, speed/efficiency savings needed

本文关键字:节省 速度 效率 逐行 读取 取文本 C++      更新时间:2023-10-16

我有一系列大的文本文件(10s-100s的数千行),我想逐行解析这些文件。这个想法是检查这行是否有特定的单词/字符/短语,如果有,现在就记录到辅助文件中。

到目前为止,我使用的代码是:

ifstream infile1("c:/test/test.txt");
while (getline(infile1, line)) {
    if (line.empty()) continue;
    if (line.find("mystring") != std::string::npos) {
        outfile1 << line << 'n';
    }
}

最终目标是将这些行写入数据库。我的想法是先将它们写入文件,然后导入文件。

我面临的问题是完成任务所需的时间。我希望尽可能减少时间,所以任何关于在上面的读/写场景中节省时间的建议都是非常受欢迎的。抱歉,如果有什么是显而易见的,我才刚刚开始学习C++。

感谢

编辑

我应该说我正在使用VS2015

编辑2

因此,这是我自己的愚蠢错误,当切换到Release并更改架构类型时,我的速度明显提高。感谢大家为我指明了方向。我也在研究mmap的东西,事实证明这也很有用。谢谢大家!

当您使用ifstream读取和处理真正大的文件时,您必须增加所使用的默认缓冲区大小(通常为512字节)。

最佳缓冲区大小取决于您的需要,但作为提示,您可以使用读/写文件的分区块大小。要知道这些信息,你可以使用很多工具甚至代码。

Windows中的示例:

fsutil fsinfo ntfsinfo c:

现在,您必须为ifstream创建一个新的缓冲区,如下所示:

size_t newBufferSize = 4 * 1024; // 4K
char * newBuffer = new char[newBufferSize];
ifstream infile1;
infile1.rdbuf()->pubsetbuf(newBuffer, newBufferSize);
infile1.open("c:/test/test.txt");
while (getline(infile1, line)) {
    /* ... */
}
delete newBuffer;

对输出流也要这样做,不要忘记在打开文件之前设置新的缓冲区,否则可能无法工作。

你可以利用价值来找到最适合你的尺码。

你会注意到区别。

C风格的I/O函数比fstream快得多。您可以使用fgets/fputs来读取/写入每一行文本。