C++逐行读取文本,需要节省速度/效率
C++ read text line-by-line, speed/efficiency savings needed
我有一系列大的文本文件(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来读取/写入每一行文本。
相关文章:
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 计算车辆之间的距离并设置速度,使距离保持不变,例如 5 米
- 如何加快大字符串的解析速度?
- 如何比较两个函数的速度和性能
- C++ 移动语义是否在任何情况下都能节省资源?
- 线程相互减慢速度
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 使用 Unity 构建加快C++构建速度,并减少标头依赖项
- C++逐行读取文本,需要节省速度/效率