【发布时间】:2009-08-10 13:15:41
【问题描述】:
我正忙着写一些东西来测试 Linux 上磁盘 IO 的读取速度。
目前我有这样的东西来读取文件:
编辑将代码更改为:
const int segsize = 1048576;
char buffer[segsize];
ifstream file;
file.open(sFile.c_str());
while(file.readsome(buffer,segsize)) {}
对于 150GB 的 foo.dat,我第一次读入它大约需要 2 分钟。 但是,如果我在第一次运行后 60 秒内运行它,则运行大约需要 3 秒。这怎么可能?当然,唯一可以这么快读取的地方是 RAM 中的缓冲区缓存,而文件太大而无法放入 RAM。
这台机器有 50GB 的内存,驱动器是一个 NFS 挂载,所有默认设置。请让我知道我在哪里可以确认这个文件实际上是以这种速度被读取的?我的代码错了吗?第一次读取文件时似乎花费了正确的时间。
编辑添加: 发现我的文件只读取到一个随机点。我设法通过将 segsize 从 1048576 更改为 1024 来解决此问题。我不知道为什么更改此设置允许 ifstream 读取整个文件而不是在随机点停止。
感谢您的回答。
【问题讨论】:
-
为什么你认为整个文件必须适合缓存?
-
第一次读取文件时,几乎完全是IO绑定,130s WALL,3s CPU,第二次读取文件时,CPU和WALL时间几乎一模一样,表示足够接近没有 IO。