[原创]基于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函数全解(五)之系统函数
系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...
- 获取linux服务器基本信息脚本
为了方便日常运维写的一段简单脚本,用于集中获取服务器操作系统.CPU.内存使用.负载.硬盘使用.网络信息. 脚本比较简单,就不解释了,有兴趣的朋友请自行查看. #!/bin/bash##Name:sy ...
- jQuery带控制按钮向上和向下滚动文本列表
效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...
- jQuery页面顶部下拉广告
本广告可以是图片也可以是Flash,可以设置自动播放的时间,可以手动停止和重播. 效果展示 http://hovertree.com/texiao/jquery/80/ 源码下载:http://hov ...
- LinQ C#防注入式攻击实例代码
注入式攻击是Web开放项目中开发人员的第一时间要考虑的问题,下面就我的开发实例分享给大家,有用的的话就点个赞吧. 定義賬戶信息類 public class UserInfors { public st ...
- Python 3.4 Library setup
matplotlib: https://pypi.python.org/pypi/matplotlib/1.4.3 Unofficial Windows Binaries for Python Ex ...
- wampsever在线模式和离线模式有什么区别
我们在开发网站的时候经常会使用到wampsever服务器,在测试项目的时候我们会经常发现,wampsever服务器在线模式和离线模式都可以使用并且测试,还有一个现象就是我们在测试无线网络,用手机访问的 ...
- 从零开始学Python08作业思路:开发简单的FTP
一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...
- android raw和assets的区别
*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1**.res/raw中的文件会被映 ...
- Maven命令行使用:mvn clean compile(编译)
先把命令行切换到Maven项目的根目录,比如:/d/xxxwork/java/maven-test,然后执行命令: mvn clean compile 执行结果如下: [INFO] Scanning ...