Chinaunix首页 | 论坛 | 博客
  • 博客访问: 786056
  • 博文数量: 179
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1536
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-27 11:05
个人简介

MySQL工程师 QQ:1815357042

文章分类

全部博文(179)

文章存档

2015年(179)

分类: LINUX

2015-04-26 20:25:49

这篇文章介绍什么是稀疏文件,让大家有一个认识

稀疏文件,这是UNIX类和NTFS等文件系统的一个特性
开始时,一个稀疏文件不包含用户数据,也没有分配到用来存储用户数据的磁盘空间。
当数据被写入稀疏文件时,NTFS逐渐地为其分配磁盘空间。一个稀疏文件有可能增长得很大。


稀疏文件以64KB(不同文件系统不同)为单位增量增长,因此磁盘上稀疏文件的大小总是64KB的倍数。
稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。
如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。 


这样,会产生一个问题,文件已被创建了,但相应的磁盘空间并未被分配,只有在有真正的数据插入进来时,才会被分配磁盘块,
如果这时文件系统被占满了,那么对该文件的写操作就会失败。


办法:
为防止这种情况,有两种办法:
(1)不产生稀疏文件
(2)为稀疏文件留够空间。
在计算机科学方面,稀疏文件是文件系统中的一种文件存储方式,在创建一个文件的时候,就预先分配了文件需要的连续存储空间,
其空间内部大多都还未被数据填充,现在有很多文件系统都支持稀疏文件,包括大部分的Unix和Windows的NTFS 。
稀疏文件被普遍用来磁盘图像,数据库快照,日志文件,还有其他科学运用上。


之前作为SQL Server 数据库管理员,知道SQL Server有两个地方用到了稀疏文件
1、数据库快照的存储格式其实就是稀疏文件,因为数据库里面某些字段可能存在着大量null值
如果为这些null值也分配磁盘空间,就会浪费很多磁盘空间,数据库快照的大小一般比原数据库大小 要小,
如果数据库存在大量null值,这个大小的差距更大了

2、从SQL Server2008开始,新建表字段的时候,可以指定这个字段是否为稀疏字段,如果程序员预计这个字段将来会有大量的null值,
那么可以将这个字段设置为稀疏列而不管你那个字段用的什么数据类型,这样当字段里有很多null值的时候,
就可以利用这个稀疏特性节省大量的磁盘空间,数据库占用的磁盘空间就没有那么大
  



使用数据库快照和稀疏列的功能时,在微软的网站声明了条件:文件系统必须是:NTFS
因为其他文件系统不支持在Windows上,只有NTFS支持


Linux文件空洞与稀疏文件
在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞。
位于文件中但没有写过的字节都被设为0。
如果offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)” 在文件里创造“空洞(hole)”。
没有被实际写入文件的所有字节由重复的0 表示(不停地填充0)。空洞是否占用硬盘空间是由文件系统(file system)决定的。




inode索引节点对稀疏文件的处理
文件系统存储稀疏文件时,inode索引节点中,只给出实际占用磁盘空间的block号,数据全0,且不占用磁盘空间,
文件block并没有物理磁盘block号。
  

linux稀疏文件Inode数据块存储
文件空洞部分不占用磁盘空间,文件所占用的磁盘空间仍然是连续的
  




 


阅读(4096) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~