这样的硬盘I/O是不是正常

kenshu 2015-10-20 06:28:29
笔记本硬盘(5400转)上256个文件,每个大约271M,共66.1G

所在分区已经整理过了,完全没有碎片.

每个操作是这样的:
1.fopen
2.第一次fseek
3.fread 4个字节
4.第二次fseek
5.fread 91个字节
6.fclose

进行10000次操作,大约是201-204秒
也就是1秒只能进行49-50次这样的操作

经过测试,其中
10000次fopen/fclose只占了2秒左右的时间。

那瓶颈是在2-5步.(其中的10000次操作,fseek的位置,可以认为是随机的,也就是前后两次的操作,缓存一定不起作用)

两个问题:
1.这个时间消耗是不是正常?如果不正常,可能出现的问题在哪里?
2.是否有办法改进?比如把每个文件分成4个或16个小文件,fseek是不是会快一点?(小文件,fseek我感觉道理上会快一点,但打开文件那一步,相反可能会慢一点。因为硬盘上文件多了,操作系统定位文件的开头也需要时间查找)
...全文
128 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2015-10-21
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
随机读写 可能寻道时间占了很多分量 5400转的一般10~20ms是正常的 用专业的硬盘测试软件 可以测出这一参数 不知道你是什么需求 如果写不是很频繁的话 可以考虑固态盘
这是一个只读的数据库,它已经在事先加入所有数据,排序,做好索引.(其中第一次fseek就是去根据要查找的内容找索引的位置,第二次fseek,就是根据索引,找VALUE) 每次要做的,只有查询.(其实它就是一个类似于CMAP的东西,并且根据需要优化了算法和存储结构,并且把它放到硬盘中/*因为我没这么大内存*/) 那么两次FSEEK(可以理解为随机的寻道),我估计是少不了的.//改为一次可以(也就是根据要查找的KEY,直接跳到VALUE那里去),但要浪费大量的空间,大约7-8倍. 因为对硬盘的数据存储结构不清楚(比如硬盘中,目录树其实也需要寻址的;一个文件中,多个不同的块,是以链表,还是其它方式组织的?分开多个小文件,FSEEK我感觉会快一点,但操作系统找到对应的文件并打开它,又会慢一点),那么问题转换为,一次寻道10ms是不是合理。(对于5400转的笔记本硬盘而言) 如果合理,那就没我什么事了。(换个72G的内存或128G的SSD,是后面的事) 如果不合理,有没有改进的空间,比如一个文件分开多个
zgl7903 2015-10-21
  • 打赏
  • 举报
回复
HD Tune Pro 测试一下
zgl7903 2015-10-20
  • 打赏
  • 举报
回复
随机读写 可能寻道时间占了很多分量 5400转的一般10~20ms是正常的 用专业的硬盘测试软件 可以测出这一参数 不知道你是什么需求 如果写不是很频繁的话 可以考虑固态盘
kenshu 2015-10-20
  • 打赏
  • 举报
回复
对了,每次打开的文件,也可以认为是随机的。 就是随机打开一个文件,随机跳到一个地方,读一定的字节,再次随机跳到另一个地方,再读一定的字节。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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