2011-11-19 110 views
0

(这不是我的计划,但我会尽力提供所有相关资料给我所知)。文件读取第一读取慢,但很快就连续读

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

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

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

如果你做数学题,连续读取速度大约是硬盘驱动器的通告读取速度。

这一切看起来像文件位置由两种操作系统或硬盘的缓存,这样在连续读取你不必去寻找文件的位置。

有谁知道到底是什么原因造成初始读取速度下降,并且是否可以预防?三秒可能看起来不是很多,但它们会使正确处理每个文件所需的总时间增加大约5个小时。

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

任何想法,将不胜感激。

+0

读取300MB文件的3秒钟大概是正确点击磁盘 - 这是100MB/s,这是速度的高端,您可以从现代快速硬盘。读取300MB文件的0.1秒不会从磁盘上脱落 - 这是从缓存中提取出来的。 – caf

回答

2

Linux会尝试将文件复制到RAM,使下一次读取速度更快 - 我猜这是发生了什么。初读是实际关闭磁盘 - 随后的读取出文件缓存的,因为整个文件已经被复制到RAM

+0

当程序迭代文件时,我监视RAM。考虑到可用空间的原始数量,文件的大小以及它在旧的“被遗忘”之前迭代的文件数量,这似乎是正确的答案。 – Morglor

+0

计算机似乎并不这样做:-)去阅读Linux缓存文档 –

1

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

0

我的猜测是,也许是第一次读它需要较长时间的文件,因为它加载的一些信息进入缓存?

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

0

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