注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简约男人

简约,不能简单

 
 
 

日志

 
 
关于我

一个过分渴望被理解的人其实就是一个软弱的人, 勇往直前的力量来自斩钉截铁的决心,不是来自别人的理解.

网易考拉推荐

监控类系统的磁盘读写优化  

2011-06-13 17:17:41|  分类: 高级开发知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

是什么影响到了磁盘读写的效率

有时候需要不断从一个数据源采集数据,并记录最近一段时间内的所有数据到磁盘。所有采集到的数据需要从效率方面和所使用的文件系统方面综合考虑分割为独立文件。所有超过历史界限的文件都需要删除,以便腾出空间来存储新文件。通常情况下,随着写入和删除的次数的增多,磁盘上的文件碎片会越来越多。也被称为磁盘碎片,指文件在磁盘里非连续地存储。随着碎片的增多,读文件时寻址的时间会增加,写文件时查找空闲磁盘空间的时间也会增加;从而会导致磁盘读写效率的下降。

磁盘碎片是怎么产生的

Windows在分配磁盘空间时拥有一个最小存储容量,称作存储单元,一个文件所占用的存储空间的大小都是存储单元的整数倍。对于NTFS文件系统有4种可选大小的存储单元,在格式化磁盘时可以看出来。

监控类系统的磁盘读写优化 - tr0217 - 简约男人
假如有多个文件顺序存储在一片连续的空间里,此时不存在磁盘碎片。当中间一个文件删除后,便空出了一段磁盘空间,此时仍然没有磁盘碎片。当有一个比这段磁盘空间更大的文件需要存入磁盘时,如果系统使用这段磁盘空间,那么系统还需要在远离这段磁盘空间的位置再为该文件分配足够的磁盘空间。此时磁盘碎片就产生了。下图表示了磁盘碎片产生的过程。

可以看出,在这里我们所说的碎片是指外部碎片,相对而言的是内部碎片。文件的存储空间是存储单元的整数倍,当文件的大小不是磁盘空间的整数时必然会有部分文件内容不能填满一个存储单元却占用了一个存储单元。这种情形就是内部碎片。内部碎片会降低磁盘的利用率;而外部碎片会降低磁盘的读写效率。当写入和删除的频率相同时,磁盘碎片的增加速度是指数级的,也就是当已经存在磁盘碎片时就会更容易产生磁盘碎片。

磁盘碎片产生的原因和避免方法

通过对磁盘碎片产生过程的分析可以知道磁盘碎片产生的原因有两个。第一,写入和删除文件;第二,删除文件所腾出的空间不能够完全容纳新写入的文件,也就是写入和删除的文件大小各不相同。避免或者减少磁盘碎片的方法就是让这两个条中的一个不成立。破坏第一个条件并不是那么显而易见。

一个逻辑盘只存储大小一致的文件

首先提供破坏第二个条件来减轻磁盘碎片的方法。就是让每一块磁盘只存储大小一致的文件。如果为了保证磁盘利用率,还要让文件的大小刚好等于最小存储单元的整数倍。

在这里的应用就是将视频文件按大小而不是时长分割,并且将视频文件和图片文件存储到不同的逻辑盘;且不允许存放其它文件。

对于抓怕的图像来说如果不压缩所有图片的分辨率都相同,占用的存储空间肯定是相同的。当然如果不压缩存储的话,将会非常浪费存储空间。通过观察发现所有采用jpg格式存储的分辨率为1512×961的图片文件的大小都不会超过512kb。所以在存储时可以在写入文件后立即将图片的大小都调整为512kb。这不会损坏图片的内容,只会在文件内部空闲一些存储空间。调整文件大小的代码如下:

监控类系统的磁盘读写优化 - tr0217 - 简约男人

不写入和删除文件,那么就只修改文件

第二方法就是使第一个条件不成立。不允许写入和删除文件,那么就只修改文件。首先在使用之前根据文件的大小创建许多预分配文件,为其设置隐藏属性,将磁盘空间占满。当需要写入新文件时,找一个没有使用预分配文件,将文件的内容写进去,注意不能添加EOF标记,图像和视频的文件头已经指明了文件的大小。此外为这些预分配文件提供一个索引文件,索引文件应该包含所有预分配文件的实际名称、删除标记、写入时间。起初索引文件中的写入时间可以为空,实际名称就是预分配文件的实际名称,删除标记都表示为true。当写入文件时从中查找一个空预分配文件将内容填充进去,将文件名称改为需要名称,将删除标记置为false,并取消隐藏属性,同时修改索引文件中相应项目。当删除文件时,将删除标记置为true,并增加隐藏属性。

其实此时完全可以将这个索引创建为环形队列,在文件头给出对头和对尾的索引。这样,一载入索引文件就能够很容易创建出一个环形队列。当写入文件时直接从队尾上找一个预分配文件使用,然后调整队尾位置。甚至没有必要删除文件了。

使用第二种方法还需要首先根据与分配文件的大小和磁盘空间计算出索引文件大小。然后首先将索引文件建立好,然后建立预分配文件。预分配文件创建代码如下:

监控类系统的磁盘读写优化 - tr0217 - 简约男人

 

优化预分配文件索引

还需要保证索引文件不能太大,最好不要超过一兆。如果用这种方式存储图片文件的话30G的一个盘的索引文件会有6万多个索引项。每个索引项的大小最好能够控制在20B之间。但是Windows系统的文件名可以有255个字符,时间需要4B来存储,(如果创建成环形队列,时间是不需要的)删除标记可以用1bit来存储,但是1bit根本不好读,还是用1B存储。那么6万多个索引项需要将近15M的空间。

使用硬链接来加速索引

使用NTFS文件系统,可以使用硬连接来快速找到文件。建立预分配文件时,文件名称从0开始递增。当需要使用某个预分配文件时,比如使用0,就为文件0建立一个硬链接,将硬链接的名称修改为需要的文件名。可以使用一个配置文件保存当前使用的文件名,也就是当前使用的文件索引。如果某个硬链接过期就将其删除,而预分配文件仍然保留。

这种方法有两个缺点:第一只能在NTFS文件系统下使用;第二删除过期的硬链接比较耗时。硬链接就是一个文件名,它通过保存文件ID的方式指向一个文件;而文件本身没有关于指向它的硬链接的信息,所以找到一个文件的所有硬链接必须遍历。

使用硬链接来加速索引的改进方案

如果遍历所有文件来查找一个文件的所有硬链接,对于小文件来说将会遍历上万次。比较的好的方式是将硬链接按天放入不同的目录。这样一来,只需将一个目录和目录下的所有硬链接全部删除;而不需要遍历查找所有的硬链接。

  评论这张
 
阅读(1476)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017