超大檔案同步如何實現?

2021-08-23 12:25:08 字數 2067 閱讀 4598

隨著計算機技術和網際網路的快速發展以及智慧型終端裝置的興起,移動化辦公已經成為常態。目前,越來越多的人們擁有多個智慧型終端裝置,這極大的方便了人們的工作和生活。智慧型終端裝置的普及在給人們帶來方便的同時,也給人們的檔案管理提出了新的挑戰。如何保證多個裝置之間的資料一致性以及如何高效地進行檔案同步成為了人們關注的焦點,除此之外,資料的可追溯性也逐漸進入人們的視野。

現有的檔案同步軟體大都沒有提供資料的可追溯性功能,一旦使用者修改檔案並儲存後就無法回退到該檔案之前的狀態。檔案同步是用於保持不同裝置上檔案一致性的應用程式。使用者通過設定乙個檔案同步目錄來儲存需要同步的檔案,當使用者更新檔案時,這些變化將自動的同步到該使用者的其他裝置上。當人們在旅行、出差時需要訪問某些遠端檔案時,檔案同步系統的作用就突顯出來了,檔案同步的應用也越來越廣。

檔案同步系統需要儲存使用者資料,這些資料往往存在許多冗餘,若對所有的使用者資料進行儲存勢必會降低系統儲存空間的利用率。本文通過分析研究了檔案系統中常用的重複資料刪除技術,並利用滑動分塊的重複資料刪除演算法實現冗餘資料的刪除。

滑動分塊演算法:使用固定大小的滑動視窗計算檔案每個位置處固定大小資料塊的弱校驗值,僅在弱校驗值匹配成功之後,該演算法將計算資料塊的 hash值並用於實現更為準確的重複資料查詢。其中只有當強弱校驗值都匹配成功時,才認為找到重複資料並將其作為乙個分界塊,該分界塊與前乙個分界塊之間的資料形成乙個不定長度的資料塊並儲存該資料塊的原始資訊及其強弱校驗值,接著移動滑動視窗大小的距離開始查詢;當匹配過程中任何乙個環節失敗或者資料塊大小達到滑動視窗大小,都意味著沒能找到重複資料,因此需要滑動視窗到下乙個位置處。滑動分塊演算法結合了定長分塊和變長分塊演算法的優點,它通過採用強弱校驗值的方式,可以避免為不相同的資料分塊計算 hash 值,從而降低了演算法的執行時間。基於變長分塊的特性,滑動分塊同樣能保證對資料插入或刪除只會影響附近的資料塊,後續的相同資料塊同樣能通過演算法匹配出來。

例如:在伺服器端有乙個檔案 a,客戶端有乙個檔案 b,現在需要將檔案 a 的內容同步到檔案 b 中,傳統的做法就是將伺服器端的檔案 a 的所有資料通過網路傳送到客戶端並重寫檔案 b。然而,當檔案 a 和檔案 b 具有一定的相似度時,這種方式將會造成網路頻寬的浪費。andrew  tridgell 在 1996 年提出的rsync同步演算法巧妙地解決了上述問題。rsync 同步流程:

1)客戶端採用定長分塊演算法對檔案進行分塊,並採用 adler-32演算法計算分塊的弱校驗值和 md5 演算法計算強校驗值;

2)客戶端將檔案分塊編號強弱校驗值傳送給伺服器進行重複資料查詢;

3)伺服器接收到檔案分塊資訊後,由強弱校驗值建立查詢樹,並將待同步的檔案進行分塊進行重複資料查詢;

4)若伺服器查詢到重複資料,則向客戶端傳送重複資料塊的編號,否則傳送檔案內容資訊;

5)客戶端在接收到來自伺服器的資訊後,並根據這些資訊構造伺服器端的檔案,從而實現將伺服器端的檔案同步到客戶端。

在 rsync 演算法中,最關鍵的部分就是上述流程中的步驟2),它通過兩輪校驗找出檔案之間的相同部分,rsync伺服器在接收到來自客戶的檔案同步請求及分塊資訊之後,利用分塊資訊建立查詢樹,隨後伺服器將待同步的檔案通過重疊檔案每個偏移分塊的方式查詢匹配資料塊。

當使用者資料發生變化時,使用者通常希望同步軟體能自動將變化的檔案同步到伺服器端,為了實現這種效果需要監控同步目錄下的檔案,從而及時地進行同步操作。

在當前的雲同步系統中,使用者如果需要儲存某個檔案的多個版本通常需要手動的重新命名檔案,然後上傳到同步系統中,隨後在其他裝置上進行操作,如此繁瑣的操作使得使用者體驗極為不佳。當使用者維護的版本過多時,要記住各個不同版本之間的差異本身就是一件很困難的事,同時,在使用時使用者還需要在眾多相似檔名中找出需要回退的版本,為此使用者需要不停的檢視對比,才能確定回退的版本;此外,由於使用者包含眾多相似的檔案,因此這些相似的檔案中必然有一部分資料是重複,對於同步系統來說,重複資料的儲存將導致系統儲存空間的利用率降低。針對上述問題,檔案同步軟體能提供很好的解決方案並有很大的市場前景。

超大檔案同步容易中斷 怎麼辦?

ftrans 小編一一道來!1 速度慢。網路差或者距離遠的話,大檔案同步時的慢可不是一般人能忍受的,嚴重影響工作效率。2 容易斷。只要檔案大了或者多了,即使網路不中斷,也會出現同步中斷 同步錯誤甚至資料遺漏的現象。萬一出現網路中斷 宕機等情況的話,情況會糟糕。3 不可靠。一些小工具尤其是免費的工具,...

php 讀取超大檔案

php開發很多時候都要讀取大檔案,比如csv檔案 text檔案等。這些檔案如果很大,比如10個g。這時,直接一次性把所有的內容讀取到記憶體中計算不太現實。遇到這種情況,往往覺得php太弱,實則不然。利用生成器 關鍵字yield 就能解決。好了,上 created by phpstorm.user a...

超大檔案編碼轉換

最近導資料,從gbk轉到utf8,檔案太大了120多m,普通編輯器無法開啟 網上有人用vim轉換,成功率也很高,iconv有時候不能轉換 如開啟windows中以ansi儲存的檔案 vim file.txt c e enc gb18030 在vim中直接進行轉換檔案編碼,比如將乙個檔案轉換成utf ...