如何高效的读写文件思考

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:深入理解计算机系统

如何高效的读写文件?

这个问题是大多数涉及磁盘读写程序都关注的一个问题。

特别是海量数据的时候,有时候不同的读写方式差别的数量级会有1~2个数量级。

例如:
20倍的效率比
1分钟与20分钟的差异;
1个小时与20个小时的差异;
1天与20天的差异;
对使用者感受差异是巨大的。

基于计算机存储的模型来看,从寄存器->逐级cache(SRAM)->内存(DRAM)->ssd固态硬盘->hdd机械硬盘,数据加载到cpu的周期都呈很大规模的增加。把文件放的约靠上层,读写效率会约高效。

cpu寄存器:延迟0个cpu周期
1级cache:延迟1个cpu周期
2级cache:延迟10个周期
3级cache:延迟30个周期
内存:延迟100个周期
ssd:延迟10,000个周期
hdd:延迟100,000个周期
//注:之前的书上数据,现在可能有所变化

文件对外提供的服务是数据的存与取,一段内存区域也可以一样有这个特性,如果是动态产生文件,不惧断电的话,文件封装到内存中也是一个不错的高效选择。

技术在进步,硬件在进步,不过对于海量数据存储而言,当前主要还需要机械硬盘这种廉价的大存储来承担数据的最终存储归宿。

机械硬盘的硬件特点,按照磁道、扇区进行进行顺序数据读取,并有磁道寻址时间;磁盘的转速是受限的,常见的5400转/min,7200转/min等。

文件系统本身也应该考虑磁盘的这个特点,对于一个文件的数据尽可能顺序存储,按照尽量同一磁道下,顺序存储,如果没有存满,也尽量考虑相邻磁道。

写数据而言

写入数据来说,考虑机械磁盘的寻道时间,旋转特点,磁头特点;

理想情况的最大吞吐量状态,我们希望磁盘沿着一个轨道一直写,写满了换相邻轨道继续写,写满这个轨道继续去下一个相邻轨道。

而要高效的写数据,也尽可能的希望沿着理想状态来走:

希望磁盘沿着一个轨道一直往后写,意味着顺序写,而不进行随机写,顺序写时效率比较高;

希望吞吐量大,就需一次多写一些,而不是写写停停,把时间花在启停上,那么就限制写的规模,把要写的数据攒起来,等达到一定规模了再向磁盘写入。例如攒到8k,再向磁盘写入。

再一方面,磁盘本身也有磁盘缓存,写入磁盘缓存速度会比较快,磁盘控制器负责把磁盘缓存内容刷到磁盘盘片上,程序通常不需要强制刷新到盘片中,而由磁盘控制器自己来调度,这样会比较高效。

写文件少一些会比较高效,关闭文件时会触发刷新到磁盘,此时如果磁盘控制器没有做完,就需要等待了。

另外还有利用操作系统向磁盘写,mmap这种映射方式写文件,程序负责写入到内存中,写完就快速返回,之后由操作系统从内存中向磁盘同步,这种方式对一定规模的写而言也会比较高效。

读数据而言

读数据和写数据原理也差不太多;

理想情况下,沿着一个磁盘轨道一直读,读完这个轨道,读下一个轨道,把整个磁盘的最大吞吐用起来。

提高读效率,顺序读会比较高效,顺序读少跳转,磁盘缓存比较容易命中。

另外一次读取量大一点会比较高效;一次多读一点,读取次数少一些也会比较高效;毕竟环境中不只我们一个程序在运行,其它程序也有在读写,如果一次读的很少,下次磁盘跳到别的轨道了,再读还需要重新轨道寻址。当然这种大也是一定规模的,受限于磁盘读的瓶颈,一定规模下才会比较高效。

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值