使用C++和Boost内存映射文件快速读取和解析txt文件

3
重要修正: 问题不是我之前说的那样,手动分析后,我了解到当我用下面这行代码替换掉原来的代码:"file >> x >> y >> z;",使用"file.readline(buffer, size);"只需要0.4秒。所以问题完全不同,如何从这一行数据中解析出float类型的数值,file>>x>>y>>z;
(我不知道是否应该删除这个问题,因为原始问题已经不相关了)
=== 旧内容 === 经过广泛的互联网和Stack Overflow研究,我了解到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秒。

有什么建议吗? 谢谢


哇!读取一个15MB的文件只需要9.5秒?这个文件并不算很大。这里肯定有什么问题。 - John Dibling
1个回答

2

流处理速度较慢。这部分是因为它们所受到的限制很繁重,另一部分原因是实现时往往优化不足。

尝试使用Boost.Spirit解析器。虽然其语法需要一些适应时间,有时编译速度也会很慢,但Spirit的运行时性能非常高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接