【问题标题】:Reading txt files and parsing them fast using c++ and boost memory mapped files使用 C++ 读取 txt 文件并快速解析它们并提升内存映射文件
【发布时间】:2013-07-03 22:48:07
【问题描述】:

重要修改: 问题不是我所说的,在手动分析后我明白当我替换行时:“file >> x >> y >> z;”使用“file.readline(buffer, size);”这一行

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

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

=== 旧 === 经过对互联网和堆栈溢出的大量研究,我了解到用 c++ 读取大文件的最佳方法是使用内存映射文件。

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

我有这个代码:

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

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

为了使用 stackoverflow 用户更快地读取文件,我想出了这段代码,如果我理解它正确使用内存映射文件并且应该更快地读取它 Stream types in C++, how to read from 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 秒?不是很大的文件。有点不对劲。

标签: c++ file boost memory-mapped-files


【解决方案1】:

流很慢。部分是因为适用于它们的约束是繁重的,部分是因为实现有优化不佳的趋势。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多