【问题标题】:How to perform fast formatted input from a stream in C++?如何在 C++ 中从流中执行快速格式化输入?
【发布时间】:2009-03-15 21:04:04
【问题描述】:

情况是:有一个文件有14 294 508个无符号整数和13 994 397个浮点数(需要读取doubles)。总文件大小约为 250 MB。

使用std::istream 大约需要 30 秒。将数据从文件读取到内存(只是复制字节,没有格式化输入)要快得多。有什么方法可以在不改变文件格式的情况下提高阅读速度?

【问题讨论】:

  • 我认为你应该发布你的循环代码
  • 如果这是 MSVC 库,您可能需要调查您从 SECURE_SCL 中招致的惩罚(默认情况下)。不过,请注意了解关闭它的含义。
  • 抱歉,应该是:_SECURE_SCL

标签: c++ performance stl file-io


【解决方案1】:

你需要使用 STL 风格的 i/o 吗?您必须查看一位专家的出色工作this。这是 Dietmar Kuhl 的专业 iostream

我不想建议这个,但请看一下 C 格式的 i/o 例程。另外,你是一口气读完整个文件吗?

【讨论】:

  • 语法和方法无关紧要 :) 是的,我正在阅读整个文件。
  • 你试过fscanf和朋友吗?我会说试一试,然后测量。
【解决方案2】:

您可能还想查看 Matthew Wilson 的 FastFormat 库:

我没有使用过,但他提出了一些令人印象深刻的主张,而且我发现他的许多其他作品值得研究和使用(有时还会被盗用)。

【讨论】:

  • 也许这些技术可以应用于输入
【解决方案3】:

您尚未指定格式。有可能您可以对其进行内存映射,或者可以读取非常大的块并以批处理算法进行处理。

此外,您还没有说您是否确定将读取它的文件和进程将在同一平台上。如果一个 big-endian 进程写入它,而一个 little-endian 进程读取它,或者反之亦然,它将无法工作。

【讨论】:

    【解决方案4】:

    与“通用”读取方法相比,自行解析输入(atoi 和 atof)通常会提高速度至少两倍。

    【讨论】:

      【解决方案5】:

      快速而肮脏的方法是将文件转储为标准 C++ 字符串,然后在其上使用字符串流:

      #include <sstream>
      // Load file into string file_string
      std::stringstream s( file_string );
      int x; float y;
      s >> x >> y;
      

      这可能不会给您带来太多的性能提升(通过避免 iostream,您将获得更大的加速),但它很容易尝试,而且速度可能足够快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 2017-03-06
        • 2011-08-06
        • 2022-01-06
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        相关资源
        最近更新 更多