使用c++和boost内存映射文件读取txt文件并快速解析它们

Reading txt files and parsing them fast using c++ and boost memory mapped files

本文关键字:文件 读取 c++ boost 内存 使用 映射 txt      更新时间:2023-10-16

重要编辑:问题不是我所说的,在手动分析后,我明白当我用"file.readline(缓冲区,大小);"替换行:"file>>x>>y>>z;"

它只需要0.4秒,所以问题完全不同,如何从文件>>x>>y>>z中解析浮点;

(我不知道我是否应该删除这个问题,因为原来的问题不相关)

===OLD====在对互联网和堆栈溢出进行了大量研究后,我明白了用c++读取大文件的最佳方法是使用内存映射文件。

我有一个txt文件,15MB,每行有3个用空格分隔的浮点值。

我有这个代码:

ifstream file(path)
float x,y,z;
while(!file.eof())
  file >> x >> y >> z;

它可以在9.5秒内读取该文件。

为了使用stackoverflow用户更快地读取文件,我想出了这段代码,如果我正确理解它,就会使用内存映射文件,并且应该更快地读取它C++中的流类型,如何从IstringStream中读取?

#include <iostream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/mapped_file.hpp>
namespace io = boost::iostreams;
int main()
{
    io::stream<io::mapped_file_source> str("test.txt");
    // you can read from str like from any stream, str >> x >> y >> z
    for(float x,y,z; str >> x >> y >> z; )
        std::cout << "Reading from file: " << x << " " << y << " " << z << 'n';
}

不幸的是,速度保持不变,仍然是9.5秒。

有什么建议吗?感谢

流速度较慢。部分原因是应用于它们的约束非常繁重,部分原因是实现有优化不力的趋势。

尝试使用BoostSpirit解析器。虽然语法需要一点时间来适应,编译有时会非常慢,但Spirit的运行时性能非常高。