第一次读取时文件读取速度慢,但连续读取速度快

时间:2011-11-19 03:53:16

标签: c++ linux fedora ifstream

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

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

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

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

如果进行数学计算,连续读取的速度大致是硬盘驱动器的公布读取速度。

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

是否有人知道究竟是什么导致初始读取速度减慢,以及是否可以阻止?三秒钟可能看起来不是很多,但它们会为正确处理每个文件所需的总时间增加约5小时。

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

任何想法都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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