本發(fā)明涉及計(jì)算機(jī)信息
技術(shù)領(lǐng)域:
:,具體涉及一種并行的數(shù)據(jù)差分方法。
背景技術(shù):
::隨著互聯(lián)網(wǎng)時(shí)代的到來,數(shù)據(jù)總量增長(zhǎng)迅速,數(shù)據(jù)壓縮在數(shù)據(jù)傳輸和存儲(chǔ)中起到重要作用。數(shù)據(jù)差分也是一種壓縮技術(shù),其利用源文件和目標(biāo)文件的差異實(shí)現(xiàn)對(duì)目標(biāo)文件的壓縮和解壓。數(shù)據(jù)差分是指通過比較源數(shù)據(jù)和目標(biāo)數(shù)據(jù)的差異,并產(chǎn)生差分?jǐn)?shù)據(jù)補(bǔ)丁。同時(shí)利用差分?jǐn)?shù)據(jù)補(bǔ)丁和源數(shù)據(jù)可以還原目標(biāo)數(shù)據(jù),從而幫助減少磁盤或?qū)拵У荣Y源消耗。數(shù)據(jù)差分技術(shù)主要應(yīng)用在軟件更新、數(shù)據(jù)傳輸和數(shù)據(jù)備份等具有對(duì)比性質(zhì)的數(shù)據(jù)處理中。例如,在軟件更新中,可以通過產(chǎn)生兩個(gè)版本的差分文件來更新軟件,減少了寬帶資源消耗。形式上,一個(gè)數(shù)據(jù)差分算法如圖1和圖2所示,需要輸入源數(shù)據(jù)和目標(biāo)數(shù)據(jù),通過源數(shù)據(jù)和目標(biāo)數(shù)據(jù)的對(duì)比,產(chǎn)生差分?jǐn)?shù)據(jù),用于記錄兩個(gè)數(shù)據(jù)間的差異;并且通過差分?jǐn)?shù)據(jù)和源數(shù)據(jù)可以無損還原目標(biāo)數(shù)據(jù)。目前常用的差分算法有diff算法、rsync算法、xdelta算法和bsdiff算法等。diff是一個(gè)文件比較工具,用來輸出兩個(gè)文件之間的差異。它通常是用來顯示一個(gè)版本的文件和以前版本的文件之間的變化。該方法能很好地處理文本文件,因?yàn)槲谋疚募淖兓蔷植康模簭囊粋€(gè)版本到下一個(gè)版本的變化可能是只有幾行,但是大部分行將保持不變。然而這種方法不適合用在可執(zhí)行文件上,因?yàn)楫?dāng)可執(zhí)行文件改變時(shí),通常會(huì)導(dǎo)致大范圍的改變。rsync是類unix系統(tǒng)下的數(shù)據(jù)鏡像備份公戶remotesync,該算法不需要兩個(gè)文件在同一臺(tái)機(jī)器上,會(huì)先找出目標(biāo)文件和源文件中相同的部分,只將那些認(rèn)為不相同的數(shù)據(jù)同步過去。由于在第一次同步時(shí)rsync會(huì)復(fù)制全部?jī)?nèi)容,在下一次只傳輸修改過的文件,所以rsync算法速度比較快。xdelta是專門用來處理二進(jìn)制文件的工具,它包括對(duì)應(yīng)的補(bǔ)丁合成工具,我們通常將它們結(jié)合起來實(shí)現(xiàn)生成補(bǔ)丁。數(shù)據(jù)差分算法bsdiff是一個(gè)基于對(duì)bzip2壓縮并且開源的構(gòu)建二進(jìn)制補(bǔ)丁的工具,bspatch是其相對(duì)應(yīng)的補(bǔ)丁合成工具。作者colinpercival在文章(colinpercival,naivedifferencesofexecutablecode,http://www.daemonology.net/bsdiff/,2003.)中簡(jiǎn)單介紹了工具的思想,并在其博士畢業(yè)論文(colinpercival,matchingwithmismatchesandassortedapplications[j].universityofoxford,2006.)有詳細(xì)的論證和描述。bsdiff算法流程如圖3所示,將算法的思想簡(jiǎn)單介紹如下:(1)源文件和目標(biāo)文件處理:包括初始化、生成后綴數(shù)組和初始化補(bǔ)丁文件:輸入源文件和目標(biāo)文件,生成源文件的后綴數(shù)組索引,逆序掃描目標(biāo)文件,以二分查找的思想在后綴數(shù)組索引中找到一系列與源文件相匹配序列;這些匹配序列必須滿足條件:假設(shè)已找到的匹配是new[x...x+k]=old[y...y+k],那么要找到的匹配對(duì)new[x'...x'+k']=old[y'...y'+k']應(yīng)該滿足new[x'+i]≠old[x'+i+(y-x)],其中i∈{z|z≥8,z∈n*},k為序列長(zhǎng)度。該算法對(duì)目標(biāo)文件的掃描策略是:從前往后依次掃描目標(biāo)文件,如果在源文件和目標(biāo)文件中找到連續(xù)的對(duì)應(yīng)字符相等的序列,即最長(zhǎng)公共前綴,或者是找到滿足上述條件的序列。則在掃描的過程中直接跳過該序列的長(zhǎng)度k,即掃描位置scan變?yōu)閟can+ks。因此,源文件和目標(biāo)文件相似性越大,掃描目標(biāo)文件所需的時(shí)間開銷越少。(2)比較文件,找到近似匹配對(duì),生成差分?jǐn)?shù)據(jù):每一個(gè)后綴向前延伸(每一個(gè)前綴向后延伸)使源文件和目標(biāo)文件中對(duì)應(yīng)位置相同的字符達(dá)到該近似匹配區(qū)域的50%以上,這樣就生成了兩兩不相交的近似匹配對(duì)。這種近似匹配將大致對(duì)應(yīng)可執(zhí)行代碼中從源代碼的未修改區(qū)域衍生出來的塊,而目標(biāo)文件中不是近似匹配對(duì)的部分,大致會(huì)對(duì)應(yīng)源代碼中修改過的行。因?yàn)樵谶@個(gè)過程中用到了延伸匹配,所以我們忽略任何一個(gè)比8個(gè)字節(jié)匹配的“更好的”的匹配。經(jīng)過這一步的處理,我們會(huì)將上一步得到的序列分為3部分,其中包括2個(gè)近似匹配對(duì)和1個(gè)非近似匹配部分,它們的相對(duì)順序是:近似匹配對(duì)、非近似匹配對(duì)、近似匹配對(duì)。(3)生成差分文件:只對(duì)上一步驟中生成的前兩部分內(nèi)容進(jìn)行處理,即第一個(gè)近似匹配對(duì)和非近似匹配對(duì),對(duì)于找到的第二個(gè)近似匹配對(duì)會(huì)在下一個(gè)找到的區(qū)域中進(jìn)行處理。差分文件包括三部分:第一部分是包含add和insert指令的控制文件塊(以下簡(jiǎn)稱ctrl塊),其中add指令由偏移量字段和長(zhǎng)度字段組成,insert指令只有一個(gè)長(zhǎng)度字段;第二部分是由近似匹配對(duì)組成的“difference”文件塊(以下簡(jiǎn)稱diff塊),該部分是由目標(biāo)文件和源文件的對(duì)應(yīng)元素做減法運(yùn)算生成,即patch[i]=new[i]-old[i];第三部分是由目標(biāo)文件中近似匹配對(duì)以外的所有字節(jié)組成的“extra”文件塊(以下簡(jiǎn)稱extra塊)。生成差分文件后,用bzip2進(jìn)行壓縮,壓縮后的文件即是最終的二進(jìn)制差分?jǐn)?shù)據(jù)。該算法最早是應(yīng)用在unix系統(tǒng)中,現(xiàn)在已經(jīng)廣泛地應(yīng)用到app的增量更新,并且chrome瀏覽器也應(yīng)用該算法來減小補(bǔ)丁包的大小。以目前手機(jī)app應(yīng)用商店的軟件更新為例,手機(jī)app應(yīng)用商店在對(duì)軟件進(jìn)行更新時(shí),都是應(yīng)用bsdiff算法先對(duì)前后版本的app軟件進(jìn)行數(shù)據(jù)差分,然后將生成的更新補(bǔ)丁發(fā)送到各個(gè)手機(jī)終端進(jìn)行軟件更新,以減少帶寬資源消耗并加速手機(jī)端app更新過程。bsdiff算法比xdelta算法產(chǎn)生的二進(jìn)制補(bǔ)丁小50-80%。該算法的時(shí)間復(fù)雜度是o((n+m)lgn),其中n表示源文件大小,m表示目標(biāo)文件大??;恢復(fù)目標(biāo)文件時(shí)的時(shí)間復(fù)雜度是o(n+m),雖然系統(tǒng)處理速度很快,但bsdiff算法非常耗費(fèi)內(nèi)存,bsdiff算法最多需要max(17*n,9*n+m)+o(1)字節(jié)的內(nèi)存,其中n為源文件的大小,m為目標(biāo)文件的大小。在由差分文件和源文件生成目標(biāo)文件時(shí),也需要n+m+o(1)字節(jié)。技術(shù)實(shí)現(xiàn)要素:針對(duì)bsdiff算法的問題,本發(fā)明提供一種并行的數(shù)據(jù)差分方法,采用多線程并行技術(shù),來提高生成補(bǔ)丁的速度。為解決上述技術(shù)問題,本發(fā)明采用如下技術(shù)方案:一種并行的數(shù)據(jù)差分方法,步驟包括:(1)文件預(yù)處理:將源文件和目標(biāo)文件初始化,生成源文件的后綴數(shù)組,創(chuàng)建補(bǔ)丁文件并初始化;(2)目標(biāo)文件切分:根據(jù)線程數(shù)目切分目標(biāo)文件,為切分后的每一部分目標(biāo)文件增加一個(gè)線程進(jìn)行獨(dú)立處理;(3)線程處理過程:在每一線程中,初始化切分后的目標(biāo)文件,創(chuàng)建patch文件,通過上述后綴數(shù)組比較源文件與目標(biāo)文件生成差分?jǐn)?shù)據(jù),將該差分?jǐn)?shù)據(jù)寫入該patch文件;(4)主進(jìn)程合并處理:將上述各線程的已寫入差分?jǐn)?shù)據(jù)的patch文件一起寫入上述補(bǔ)丁文件。進(jìn)一步地,將源文件和目標(biāo)文件初始化是指,為源文件和目標(biāo)文件分配內(nèi)存空間,將源文件和目標(biāo)文件讀入內(nèi)存中,記錄該兩個(gè)文件大小。進(jìn)一步地,初始化的補(bǔ)丁文件所含信息包括版本標(biāo)識(shí)符、目標(biāo)文件大小及patch塊個(gè)數(shù)。進(jìn)一步地,后綴數(shù)組由序號(hào)和位置構(gòu)成,其中序號(hào)表示后綴數(shù)組的排序,位置表示讀取源文件的內(nèi)存起始位置。進(jìn)一步地,目標(biāo)文件切分時(shí),可根據(jù)文件大小平均切分,或者根據(jù)目標(biāo)文件與源文件的相似程度進(jìn)行切分。進(jìn)一步地,初始化切分后的目標(biāo)文件是指,初始化切分后的目標(biāo)文件大小和內(nèi)存起始位置。進(jìn)一步地,差分?jǐn)?shù)據(jù)包括diff塊、ctrl塊和extra塊,并進(jìn)行bzip2壓縮。進(jìn)一步地,patch文件所含信息包括ctrl塊數(shù)目和diff塊數(shù)目,以及bzip2格式的ctrl塊數(shù)據(jù)、diff塊數(shù)據(jù)和extra塊數(shù)據(jù)。本發(fā)明的有益效果是,基于多線程并行思想,通過改進(jìn)bsdiff算法,利用并行計(jì)算技術(shù)加快數(shù)據(jù)差分速度,提高了差分算法的處理速度,降低執(zhí)行時(shí)間。附圖說明圖1為數(shù)據(jù)差分算法生成差分文件/補(bǔ)丁示意圖。圖2為數(shù)據(jù)差分算法生成目標(biāo)文件示意圖。圖3為bsdiff算法流程示意圖。圖4為5個(gè)線程的并行bsdiff算法流程示意圖。圖5為采用本發(fā)明的并行的數(shù)據(jù)差分方法的流程示意圖。圖6為還原目標(biāo)文件的流程示意圖。圖7為ireader.apk(1.6版本到1.8版本)各個(gè)線程生成的patch文件示意圖。圖8為ireader.apk(1.6版本到1.8版本)補(bǔ)丁文件結(jié)構(gòu)示意圖。圖9為原bsdiff算法與并行bsdiff算法執(zhí)行時(shí)間對(duì)比圖。具體實(shí)施方式為使本發(fā)明的上述特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉實(shí)施例,并配合所附圖作詳細(xì)說明如下。本發(fā)明使用并行思想改進(jìn)bsdiff算法,實(shí)現(xiàn)了一種并行的數(shù)據(jù)差分方法。在時(shí)間上有良好的性能,并且沒有增加額外的空間消耗。并行思想是利用眾核技術(shù),將原本單線程執(zhí)行的程序分成多個(gè)線程同步執(zhí)行,從而達(dá)到加速的目的。該并行思想如圖4所示,將目標(biāo)文件分成n份,交給n個(gè)線程單獨(dú)處理并生成各自的patch文件,然后將每一個(gè)patch文件合并,組成差分文件(補(bǔ)丁文件)。本發(fā)明利用這種方式減少生成差分?jǐn)?shù)據(jù)的時(shí)間。本方法采用改進(jìn)的bsdiff算法,即并行bsdiff算法,流程如圖5所示,主要分成四部分:(1)文件預(yù)處理:包括初始化、生成后綴數(shù)組和初始化補(bǔ)丁文件三部分。首先,初始化目標(biāo)文件和源文件大小,分配內(nèi)存空間;然后,生成源文件的后綴數(shù)組;最后,創(chuàng)建補(bǔ)丁文件,初始化補(bǔ)丁文件信息,如版本標(biāo)識(shí)符、目標(biāo)文件大小、patch塊個(gè)數(shù)(即patch文件個(gè)數(shù),亦即線程個(gè)數(shù))等。(2)目標(biāo)文件切分:根據(jù)線程數(shù)目,將目標(biāo)文件按大小平均切分,為每一部分目標(biāo)文件增加一個(gè)線程獨(dú)立處理。需指出的是,上述平均切分不以為限,還可以采用其他方法,如根據(jù)目標(biāo)文件與源文件的相似程度進(jìn)行切分,保證每一部分的目標(biāo)文件與對(duì)應(yīng)位置的源文件相似度大致相同。由于線程處理速度與目標(biāo)文件和源文件的相似程度成正比,相似程度越高,處理速度越快,故該兩種方法也各有特點(diǎn):前者方法簡(jiǎn)單,但可能導(dǎo)致各個(gè)線程處理速度長(zhǎng)短不一;而后者可保證較高相似度,可以提高線程整體處理速度,但計(jì)算相似度會(huì)帶來一定的額外開銷。由于切分對(duì)整個(gè)方法性能影響不大,故才用哪種方法均可,差別不大。(3)線程處理過程:線程流程為:1)初始化階段:包括初始化目標(biāo)文件分塊大小、起始位置;2)初始化patch文件:包括創(chuàng)建patch文件等;3)生成差分?jǐn)?shù)據(jù):通過后綴數(shù)組比較源文件與目標(biāo)文件,生成需要的diff塊、ctrl塊和extra塊,并進(jìn)行bzip2壓縮;4)寫入補(bǔ)丁信息:將差分?jǐn)?shù)據(jù)和差分塊(即diff塊、ctrl塊和extra塊)的數(shù)量寫入patch文件。(4)主進(jìn)程合并處理:主進(jìn)程將各個(gè)線程生成的patch文件合并,寫入補(bǔ)丁文件。表1是并行bsdiff算法生成的差分文件的格式,包括版本標(biāo)識(shí)符、目標(biāo)文件大小以及patch塊的個(gè)數(shù),在文件末尾依次記錄每一個(gè)patch塊的bzip2的壓縮數(shù)據(jù)。patch文件的格式如表2所示,patch文件格式是原bsdiff算法中的差分文件格式,包括ctrl塊數(shù)目、diff塊數(shù)目,bzip2格式的ctrl塊數(shù)據(jù)、bzip2格式的diff塊數(shù)據(jù)和bzip2格式的extra塊數(shù)據(jù)。表1差分文件格式起始位置所占大小(字節(jié))說明08“bsdiff40”版本標(biāo)識(shí)符88目標(biāo)文件大小168patch塊的個(gè)數(shù)248第1個(gè)線程生成的bzip2格式的patch塊328第2個(gè)線程生成的bzip2格式的patch塊………24+8*(i-1)8第i個(gè)線程生成的bzip2格式的patch塊表2patch文件格式起始位置所占大小(字節(jié))說明08ctrl塊的數(shù)目,用x表示88diff塊數(shù)目,用y表示16xbzip2格式的ctrl塊,x字節(jié)16+xybzip2格式的diff塊,y字節(jié)16+x+y?bzip2格式的extra塊,文件剩余大小本發(fā)明旨在以bsdiff算法為基礎(chǔ),改進(jìn)bsdiff算法,基于多線程并行思想,利用并行計(jì)算技術(shù)加快數(shù)據(jù)差分速度,提高了差分算法的處理速度。還原目標(biāo)文件的過程速度較快,只需按照原bspatch算法依次處理patch文件部分即可,所以沒有使用并行計(jì)算(眾核)技術(shù),具體方法如圖6所示:步驟如下:(1)初始化:讀取補(bǔ)丁文件、校驗(yàn)版本號(hào)和讀取數(shù)據(jù)塊長(zhǎng)度等,同時(shí)分別整理出差分文件中不同線程的處理部分,等待依次處理。(2)依次處理patch部分:根據(jù)patch數(shù)據(jù)中的控制塊,讀取diff塊長(zhǎng)度、讀取extra塊長(zhǎng)度和源文件跳躍長(zhǎng)度進(jìn)行操作,還原每一部分目標(biāo)文件。(3)生成目標(biāo)文件:將每一部分的文件合并為目標(biāo)文件。針對(duì)本發(fā)明提供的并行的數(shù)據(jù)差分方法,在此列舉一實(shí)施例,本實(shí)施例以ireader.apk的1.6版本(源文件,3092113字節(jié))和1.8版本(目標(biāo)文件,3400660字節(jié))為數(shù)據(jù)樣本,使用四個(gè)線程詳細(xì)說明生成補(bǔ)丁文件的具體實(shí)施情況。(1)初始化階段:主要為讀入源文件和目標(biāo)文件到內(nèi)存中,記錄源文件大小(3092113字節(jié))和目標(biāo)文件大小(3400660字節(jié))等。(2)生成源文件的后綴數(shù)組:如表3所示,其中序號(hào)表示數(shù)組的排序,位置表示的是讀取源文件的內(nèi)存的起始位置。例如,(2,3092111)表示的是排名第2位的后綴數(shù)組是從源文件第3092111字節(jié)開始(包含第3092111字節(jié))到源文件末尾組成的后綴數(shù)組。表3ireader.apk(1.6版本)生成的后綴數(shù)組表序號(hào)位置0309211313092112230921113309211041474694……309211113874113092112138741030921131389409(3)創(chuàng)建補(bǔ)丁文件“ireader-16-18.patch”:將標(biāo)識(shí)符“bsdiff40”、目標(biāo)文件大小“3400660”和patch塊個(gè)數(shù)“4”寫入補(bǔ)丁文件。(4)將目標(biāo)文件分成四份,每份大小為850165字節(jié),分別交給四個(gè)線程進(jìn)行處理。線程處理分為兩步:1)尋找差異元素個(gè)數(shù)至少為8的區(qū)域,將每一部分得到的區(qū)域個(gè)數(shù)如表4所示;表4ireader.apk(1.6版本到1.8版本)線程內(nèi)部區(qū)域劃分個(gè)數(shù)線程1234個(gè)數(shù)13015283104914622)將上一步找到的每一個(gè)區(qū)域進(jìn)一步處理為差分文件的ctrl塊、diff塊和extra塊,并寫入patch文件;圖7是各個(gè)線程生成的patch文件內(nèi)容。3)隨后等待4個(gè)線程執(zhí)行完畢,分別讀取每個(gè)線程生成的patch文件,將其內(nèi)容整理為一個(gè)補(bǔ)丁文件。如圖8所示,四個(gè)patch文件大小分別為623559字節(jié)、290112字節(jié)、289565字節(jié)和662986字節(jié),補(bǔ)丁文件大小為1866278字節(jié)。測(cè)試數(shù)據(jù)對(duì)比本測(cè)試數(shù)據(jù)使用ireader1.6.apk(2.94mb)和ireader1.8.apk(3.24mb),wechat2.0.exe(32.9mb)和wechat2.1.exe(32.9mb),qq8.3.exe(54.2mb)和qq8.4.exe(55.6mb)。實(shí)驗(yàn)機(jī)器cpu是inter2.27ghz,8核處理器,同時(shí)擁有8.00g內(nèi)存,操作系統(tǒng)是centos6.5版本。在測(cè)試實(shí)驗(yàn)過程中,采用兩種方法進(jìn)行,即原bsdiff算法和本發(fā)明方法采用的并行bsdiff算法,以進(jìn)行數(shù)據(jù)對(duì)比。采用并行bsdiff算法時(shí),對(duì)目標(biāo)文件進(jìn)行等量切分。圖9所示是原bsdiff算法和并行bsdiff算法性能對(duì)比,由該圖可知,本發(fā)明方法在4線程和8線程下的處理時(shí)間大大縮短,為原bsdiff算法處理時(shí)間的30%~50%。表5和表6是還原數(shù)據(jù)過程中的差分文件大小和執(zhí)行時(shí)間對(duì)比。由表5可知,兩種算法生成的差分文件大小相同,說明本發(fā)明方法并未增加差分文件大小。由表6可知,兩種算法以及并行bsdiff算法采用的不同線程數(shù)目,生成的差分文件在進(jìn)行目標(biāo)文件還原時(shí),還原時(shí)間有一定差異,但這種差異很小,可忽略不計(jì),證明本發(fā)明方法所生成的差分文件并未明顯增加目標(biāo)文件的還原時(shí)間。表5差分文件大小比較(4線程)測(cè)試數(shù)據(jù)(mb)原bsdiff算法并行bsdiff算法ireader.apk1.771.77wechat.exe30.030.0qq.exe52.452.4表6目標(biāo)文件還原時(shí)間比較(單位/s)由本測(cè)試對(duì)比可知,與原方法相比,采用本方法生成補(bǔ)丁文件所用時(shí)間大大縮短,而且不增加差分文件大小和目標(biāo)文件的還原時(shí)間。需特別指出的是,本發(fā)明中,差分文件即補(bǔ)丁文件,為同一文件的兩個(gè)名稱,補(bǔ)丁文件是針對(duì)軟件更新而言,差分文件是針對(duì)并行bsdiff算法而言。另外,每一線程生成的patch文件也是一種補(bǔ)丁文件,為便于區(qū)分,本發(fā)明只稱之為patch文件。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12