[原创]基于rsync算法的目的性改进-RexSync
rsync是一种文件差异传输的算法,特点是高效且相似块识别率较高。具体算法这边就不赘述,网上很多,官方文档也描述的很清楚。
rsync提高文件比对效率的一个核心算法之一就是rolling checksum,官方使用的是Alder32 Hash算法。
在我经历的一个项目中,我们在Windows Azure中实现文件差异传输模块,我使用rsync时发现在本地测试速度非常理想,但一旦放到实际环境中则让人完全无法接受。
于是走上了漫长而痛苦的优化之路。。。。。。
除了外部的一些调优,最终我还是决定在rsync的算法上开刀。经过冥思(真的就只是坐着不动,连续几个小时的思考),有一个想法跳了出来 -- Jump Rolling!
rsync中的rolling是一个痛苦漫长计算消耗极大的过程,为了更好的比对文件差异,rsync是逐个字节(byte)进行计算hash比对的,听上去很恐怖,不过如果你看了rolling checksum的算法就知道这个还是很巧妙的提高了rolling的效率。
当rolling了一个chunk的数据发现匹配了,这样很好,标记为匹配,接着从下个chunk开始计算。但如果一直不匹配,rolling就必须一个字节一个字节的进行。
假设一下我们A和B两个文件长度都为100,分成10块每个chunk长度为10:
第一种情况:
A和B完全是相同的两个文件
Rolling开始计算第一块,匹配,接着计算第二块,匹配…… 一共计算5次弱hash和强hash,结束。
第二种情况:
A和B完全不同
Rolling开始计算第一块,不匹配,向后rolling步进为1,直到文件结束都不匹配,一共rolling了90次,结束。(注意直接计算一个chunk的弱hash比rolling一个字节消耗要大,但rolling仍然是非常消耗时间和CPU的计算过程)
好了,到这里我们发现对于匹配度高的文件,rsync计算神速,但匹配度低的文件由于要不断rolling,计算速度就陡然降低很多。
我想到的是我们来根据前面块的计算去“预测”后面块的匹配度。(这怎么可能预测!!!)
是的,预测的算法很多,我使用的是一种比较简单的逻辑“如果出现rolling一整个chunk都没有找到匹配,则预测下个chunk也不匹配”,然后直接跳过下个chunk不计算;进阶的预测是“如果继续出现rolling一整个chunk不匹配,则预测接下来N个chunk也不匹配”,N是关于“连续出现不匹配次数M”的一个函数,函数设计的好可以提高速度又不至于降低太多精度,我用的函数的n = 2^(m-1), 然后根据chunk数量设置了阀值避免跳跃跨度过高(阀值函数也可以自己设计,这边我参考的是rsync的分块算法来完成我的阀值算法)。最后补充规则“当rolling到匹配块时,N重置”,这个规则提高计算结果的匹配精度。OK,这个就是RexSync的精髓了。
再来用RexSync分析状况二:
Rolling开始计算第一块,不匹配,,向后rolling步进为1,直到第2个chunk结束仍然不匹配,跳过chunk3计算chunk4不匹配,rolling chunk5不匹配,跳过6和7计算chunk8不匹配,rolling chunk9不匹配,跳过chunk10结束。rolling了30次,比起rsync的90次降低很多。当然这个例子太简单,实际情况下降低的更多。
好了,这样jump啊jump,精度损失如何?
实际测试结果,精度比rsync下降0-10%左右,当然理论极端值是精度下降到0(除非你根据RexSync的特征制造专门的文件啊亲你真可爱,jump过的chunk都匹配是要闹哪样!)。不过牺牲了一点精度,性能确实极大提高了。你不喜欢牺牲精度?看看标题我怎么写的!!
之前在公司写过正式文档,这篇随便乱写的。sign~
[原创]基于rsync算法的目的性改进-RexSync的更多相关文章
- 一种基于Rsync算法的数据库备份方案设计
根据容灾备份系统对备份类别的要求程度,数据库备份系统可以分为数据级备份和应用级备份.数据备份是指建立一个异地的数据备份系统,该系统是对原本地系统关键应用数据实时复制.当出现故障时,可由异地数据系统迅速 ...
- R语言︱情感分析—基于监督算法R语言实现(二)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:本文大多内容来自未出版的<数据 ...
- 基于KMP算法的字符串模式匹配问题
基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意...差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错,我放了超链接,点 ...
- Python实现一条基于POS算法的区块链
区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的 ...
- 基于rsync方式的文件备份
rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,我们还可以把它作为不同主机网络备份工具之用.本文主要讲述的是如何自架rsync服 务器,以实现文件传输.备份和镜像.相对ta ...
- LinkedList实现基于LRU算法的缓存
LinkedList实现基于LRU算法的缓存 2015年08月07日 18:18:45 秦江波 阅读数 2068 文章标签: java算法linkedlist缓存LRU更多 分类专栏: Java ...
- 判断用户输入的银行卡号是否正确--基于Luhn算法的格式校验
开发中,有时候,为了打造更好的用户体验,同时减轻服务器端的压力,需要对于一些如,手机号码,银行卡号,身份证号码进行格式校验 下面是判断银行卡号输入是否正确的代码(基于Luhn算法的格式校验): iOS ...
- #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- 详解rsync算法--如何减少同步文件时的网络传输量
先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A.B和server上的文件内容都是相同的(记为File.1).某一时刻,B修改了文件内容,上传到SERVER上(记为F ...
随机推荐
- CSS魔法堂:Box-Shadow没那么简单啦:)
前言 说起box-shadow那第一个想法当然就是用来实现阴影,其实它还能用于实现其他好玩的效果的,本篇就打算说说box-shadow的那些事. 二话不说看效果 3D小球 <style typ ...
- 使用QUnit进行自动化单元测试
前言 前阵子由于项目需求接触了java的单元测试JUnit,就顺带着学习了前端的单元测试:Qunit. 既然跟测试有关,不妨介绍一下测试中的黑盒测试.白盒测试以及单元测试. 1.黑盒测试:所谓的黑盒, ...
- LocalDB在IIS中的运行失败
Using LocalDB with Full IIS, Part 1: User Profile http://blogs.msdn.com/b/sqlexpress/archive/2011/12 ...
- MySQL数据迁移到MSSQL-以小米数据库为例-测试828W最快可达到2分11秒
这里采用.NET Framework 4.0以上版本中新出现的 ConcurrentQueue<T> 类 MSDN是这样描述的: ConcurrentQueue<T> 类是一个 ...
- WEB架构师成长系列索引
WEB架构师成长系列索引 http://www.cnblogs.com/seesea125/archive/2012/04/17/2453256.html
- WinServer远程部署系统(RDSystem)
系统简介 RemoteDeploySystem是一套BS结构的远程部署管理系统(简称RDSystem),可以通过浏览器上传web站点和windows服务的更新包到RDSystem服务器,然后对多个服务 ...
- repeater三级嵌套绑定
<asp:Repeater ID="rpt1" runat="server" onitemdatabound="rpt1_ItemDataBou ...
- Newtonsoft.Json(Json.Net)学习笔记
Newtonsoft.Json 在Vs2013中就有自带的: 下面是Json序列化和反序列化的简单封装: /// <summary> /// Json帮助类 /// </summar ...
- 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作
关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...
- 使用TabPageIndicator的样式问题
在使用TabPageIndicator往往会出现一些样式问题,导致看不到字,下面是总结的步骤: 1.布局<LinearLayout xmlns:android="http://sche ...