【问题标题】:File reads slow on first read, but fast on consecutive reads文件在第一次读取时读取速度较慢,但​​在连续读取时速度较快
【发布时间】:2012-01-01 18:25:58
【问题描述】:

(这不是我的计划,但我会尽我所能提供所有相关信息。)

有一个程序可以读取大约 300MB 大小的二进制文件,对其进行处理并输出一些信息。该程序使用 ifstream 进行文件输入,并且每次读取都会正确初始化和关闭流。

程序必须多次读取每个文件。第一次读取一个文件大约需要 3 秒,每次连续读取大约需要 0.1 秒。如果处理了多个文件,返回到第一个文件仍然会产生较快的读取速度,但一段时间后重新读取文件会变慢。

另外,如果一个文件被复制到另一个位置,新文件的第一次读取速度大约是 0.1 秒。

如果你算一下,连续读取的速度大致就是硬盘的宣传速度。

所有这些看起来文件位置都由操作系统或硬盘驱动器缓存,因此在连续读取时您不必寻找文件位置。

有谁知道导致初始读取速度变慢的确切原因,是否可以防止?三秒钟可能看起来不多,但它们会增加大约 5 个小时来正确处理每个文件所需的总时间。

此外,该程序在 Fedora 14 和 Scientific Linux 上运行,两个操作系统都有其默认文件系统。

任何想法都将不胜感激。

【问题讨论】:

  • 3 秒读取一个 300MB 的文件对于访问磁盘来说是正确的 - 即 100MB/s,这是您可以从现代、快速的硬盘中获得的最高速度。读取 300MB 文件的 0.1 秒不是从磁盘中取出的——而是从缓存中取出的。

标签: c++ linux fedora ifstream


【解决方案1】:

Linux 会尝试将文件复制到 RAM 中以加快下一次读取速度 - 我猜这就是正在发生的事情。初始读取实际上是在磁盘外 - 后续读取超出了文件缓存,因为整个文件已复制到 RAM

【讨论】:

  • 我在程序遍历文件时监控了 RAM。考虑到原始可用空间量、文件大小以及在旧文件被“遗忘”之前迭代的文件数量,这似乎是正确的答案。
【解决方案2】:

操作系统 (Linux) 具有磁盘缓存。读取一次文件后,它就在缓存中。

【讨论】:

    【解决方案3】:

    我的猜测可能是它第一次读取文件需要更长的时间,因为它会将一些信息加载到缓存中?

    第一次之后,它只是使用了缓存中的一些信息。

    【讨论】:

      【解决方案4】:

      是的,数据被缓存。您可以使用 readahead 系统调用强制进行缓存(或者只是让另一个进程读取它)。如果使用mmap,你也可以使用madvise

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 2019-02-05
        • 2016-05-28
        • 1970-01-01
        相关资源
        最近更新 更多