[原创]基于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 ...
随机推荐
- Sql Server函数全解(二)数学函数
数学函数主要用来处理数值数据,主要的数学函数有:绝对值函数,三角函数(包括正弦函数,余弦函数,正切函数,余切函数).对数函数,随机函数等.在错误产生时,数学函数将返回空值null.本次介绍各种数学 ...
- 【Python实战】Pandas:让你像写SQL一样做数据分析(二)
1. 引言 前一篇介绍了Pandas实现简单的SQL操作,本篇中将主要介绍一些相对复杂一点的操作.为了方便后面实操,先给出一份简化版的设备统计数据: 0 android NLL 387546520 2 ...
- Bootstrap 3.0正式版发布!
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,包含了丰富的Web组件.根据这些组件,开发者可以快速的搭建一个漂亮.功能完备的网站.在经过Bootstrap 3 RC版的测试和 ...
- 在ASP.NET Core使用Middleware模拟Custom Error Page功能
一.使用场景 在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAtt ...
- C# DataGrid根据某列的内容设置行字体加粗 单元格设置对齐方式
最近做了个功能,DataGrid显示具体内容的时候,根据某列分组. 每个分组具体内容后边,增加一行显示合计信息. 查询数据时,使用了union all将分组数据与明细数据合并起来,使用了排序达到了预期 ...
- 创业公司招php商城开发者
众筹 电商 已经融资100W美元 职位要求1.对PHP编程熟悉程度以上,有电商相关开发经验优先:2.熟悉lnmp相关配套搭建运维,开发;熟悉linux 使用3.对数据结构和算法设计有较深刻的理解:4 ...
- 基于CkEditor实现.net在线开发之路(1)
我以前的公司使用office sharepoint designer为界面设计器,嵌套各种自定义控件,进行各种管理软件,工作流的开发,遇到比较复杂的逻辑,则采用本地写类库,生成DLL上传到服务器,通过 ...
- jsp页面显示问题
一.在jsp页面的表格中,如果有表格中的某一个元素 内容太长,需要截取显示,方法如下: <%@ taglib prefix="fn" uri="http://jav ...
- 向 div 元素添加圆角边框:
div { border:2px solid; border-radius:25px; }
- thinkcmf开发--关于控制器
一.安装 安装---删除install文件--删除index.php--修改数据库信息--创建数据库 修改数据库信息:\data\conf\db.php(包括服务器地址) 二.创建mobile app ...