基于内容可变长度分块Content Defined Chunking

最近在研究开源网络云盘代码,发现他们在文件存储时用到一种文件切割复用的技术,能大大提高磁盘使用率,节省空间

在网上找了些这个技术(Content Defined Chunking)的一些说明。


基于内容可变长度分块

1,简介
重复数据块检测技术分为,固定分块检测技术(Fixed-Sized Partition, FSP),可变分块检测技术(Variable-Sized Partition, VSP),滑动块技术(Sliding Block)。
固定分块将数据流按固定的长度分块,实现很简单,但某一处数据的变化将导致之后的所有分块都发生变化,从而无法进行匹配。因此,固定分块技术在实际中应用较少。可变分块技术则可弥补固定分块技术的这一局限性,能更加灵活的找出重复数据。基于内容可变长度分块(Content-Defined Chunking, CDC)是可变分块(Variable-Sized Partition, VSP)的一种。

2,理论基础
CDC的理论基础是rabin fingerprint,请参照Michael O. Rabin的Fingerprinting by Random Polynomials. 

3,具体实现
文件被分为长度可变的数据块,数据块的长度在一个规定的最小值和最大值之间。可变长度的数据块用一个滑动窗口来划分,当滑动窗口的 hash 值与一个基准值相匹配时就创建一个分块,这样数据块的尺寸就可达到一个期望的分布。Rabin’s fingerprint 预先定义两个整数 D 和 r(r<D) 一个大小为 w 的固定窗口在文件上滑动。假如在位置 k,固定窗口内数据的 hash 值为 f,如果f mod D = r,则该位置为数据块的一个边界。重复这个过程,直至整个文件都被分块。



实现起来也不是很复杂,但需要对每一次滑动都计算依次窗口内的hash值,计算量增加。另外,如果选择的D和r不合适,会导致窗口过小(很容易匹配上)或过大(很难匹配上)

4,与固定分块技术的对比
现在有一串数据D0:(ABCDEFGHIJKLMNOP),以固定分块为(ABCD | EFGH | IJKL | MNOP ),假如中间某部分数据发生了变化,数据变为D1:(ABCDEF22GHIJKLMNOP),那么固定分块为(ABCD | EF22 | GHIJ | KLMN | OP),除了第一块,其他所有的块都无法完成匹配。
如果采用CDC,假设初始分块也是(ABCD | EFGH | IJKL | MNOP),那么意味着在D, H, L这三个窗口内,是符合fmodD=r的条件的,当数据发生改变时,由于DHL这三个窗口并未发生改变,他们依然被认定为边界,那么分块有可能变成(ABCD | EF22GH | IJKL | MNOP),这样,除了发生改变的第二个块不能完成匹配外,其他三个数据块的匹配不会收到影响。

CDC其实早已应用广泛,其最早是用在低带宽环境的数据传输与同步,如rsync即使用CDC技术,来检测本次备份与上次备份之间的差异,从而达到只传递差异部分的目的。

参考文献
1,低带宽环境下基于混合方法的文件复制算法*
徐旦 1+, 生拥宏 2, 鞠大鹏 2 ,吴建平 1,汪东升 2,3
2,Michael O. Rabin Fingerprinting by Random Polynomials. 
3,基于Rabin指紋方法的URL去重算法


转自: http://blog.chinaunix.net/uid-25871104-id-3084904.html

没有更多推荐了,返回首页