2012-3-19日总结

今天大部分时间都在研究CDC基于文件内容的块切分方法,由于该CDC方法是基于一个开源软件dedup的,单存研究算法不太可能,需要对该函数上下文进行学习。基本上了解了CDC基于内容的块切分算法。大体思路如下:

1 从文件中读取数据,以exp_size大小来读取,将其读取到BUF中,这个exp_size第一次的大小为BUF_MAX_SIZE,然后后面每次为BUF_MAX_SIZE-上一次该buf未被切分的数据块

2 首先判断是否为最后一块,这能能够省去后面无用的比对,因为在cdc算法中块大小有限制,所以当rwsize(从文件中读取的数据)+bpos(上次剩余数据大小)+block_sz(上次存放到block_buf中未切分的数据)<Block_Min_Size的话,那么就为最后一块,跳出循环,直接将数据存放到最后一块的内存空间中。

3 设置head ,tail。就是指向Buf的首尾,head=0,tail=bpos(上一块buf中为切分的数据块)+rwsize(这次读取的数据块大小)

4  判断block_sz(上次剩余未切分的block_buf中的数据)如果小于block_Min_size-block_win_size的话,那么就需要进行填充,已满足至少block_sz+win_buf>=block_min_size

   如果小于的话,就通过memcpy从buf中读取一定数据。同时更改head(head保持在block_buf和win_buf的分界处)

5 判断head+win_buf<=tail如果满足才能进入循环对buf中的数据进行切分。这要是为了保证block_sz+win_buf大于等于最小划分数据块

6 拷贝head后面win_size(滑动窗口大小)的数据进入win_buf进行校验码计算,看是否满足hkey%block_size=13,如果满足则进行数据块划分,存放数据块,同时判断是否重复

   如果不满足,那么就要移动head(就会相应的扩大block_buf)但必须要保证block_sz不大于最大划分数据块,否则不需要进行win校验码判断,直接将该数据块划分。

7 最重要的就是边界条件了,当划分完上一块block_buf为空了,则需要再次拷贝buf中的数据,此时需要判断

第一种情况:如果tail-head<=block_min_size-win_size 那么block_sz则等于tail-head,同时更新head,此时由于数据拷贝完了,head==tail了,就不能切分了,就需要重新读取exp_size(此时等于BUF_MAX_SIZE)大小的数据,重新更新头部,再次添加block_buf使其满足大小为Block__Min_size-win_size

第二种情况:当tail-head>block_min_size-win_size,那么block_sz=BLOCK_MIN_SIZE - BLOCK_WIN_SIZE同时移动head.。但是此时head+win_size>tail的。那么此时就不满足的切分的条件。用bpos=tail-head存放这次剩余的为切分的buf, exp_rwsize (下次需要读取的数据大小)= BUF_MAX_SIZE - bpos;同时将剩余的buf中的数据移动buf的头部,这样直接在尾部添加数据就可以了。此时由于block_sz已经满足条件则可以进行这次的buf的数据块划分。


8 具体流程图如下 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值