大文件读取速率问题

ytq0416 2015-07-06 10:29:44
我使用ReadFile函数读取不同大小的文件,发现所用的时间并不是一种简单的线性关系,我设置的每次读写buffer为1M,当我读1G左右的文件时,全部读完(不处理)耗费时间不用1s,但是当我读25G的文件时,耗费时间却达到10m,有人能够帮我解释下吗?

主要代码大致如下:
DWORD dwTimeStart = GetTickCount();
while (TRUE)
{
if (!ReadFile(hFile, pBuffer, 1024 * 1024, &dwByteRead, NULL))
{
_tprintf(_T("Read file failed!"));
break;
}

if (dwByteRead == 0)
break;
}
DWORD dwTimeEnd = GetTickCount();
...全文
129 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
假正经的班长 2015-07-06
  • 打赏
  • 举报
回复
读取1G不到1S?不可能吧,磁盘通常达不到这样的读取速度,除非你是SATA3代以上的高端SSD或者磁盘阵列。 25G读取10分钟,也就是1秒钟40MB左右,对普通机械硬盘不算高,正常应该有80MB/S左右,如果文件在最后一个分区,也可能会是40MB/S左右 你用ATTO Disk测试一下存放文件的那个分区读取1M时的速度。
ytq0416 2015-07-06
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428 在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快
非常感谢!
ytq0416 2015-07-06
  • 打赏
  • 举报
回复
引用 2 楼 GKatHere 的回复:
物理的不太明白, 不过如果你读的小文件刚好在缓冲区内, 那就会很快, 如果, 有一文件大小标为1G, 而实际扇区并未占用1G(可能只有1K), 呵呵.....
之前打开文件FILE_ATTRIBUTE_NORMAL方式,所以读过一次文件之后,我想是因为操作系统的缓存机制,导致我后来再读的时候速度特别快?后来我改为FILE_FLAG_NO_BUFFER后,读1G大小的文件确实大概是100M/s
赵4老师 2015-07-06
  • 打赏
  • 举报
回复
您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428 在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快
GKatHere 2015-07-06
  • 打赏
  • 举报
回复
物理的不太明白, 不过如果你读的小文件刚好在缓冲区内, 那就会很快, 如果, 有一文件大小标为1G, 而实际扇区并未占用1G(可能只有1K), 呵呵.....

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧