本發(fā)明屬于計(jì)算機(jī)和互聯(lián)網(wǎng)領(lǐng)域,具體的,涉及一種清洗比對(duì)入庫(kù)方法。
背景技術(shù):
近年來(lái),隨著計(jì)算機(jī)和互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,我們處在了一個(gè)信息爆炸的時(shí)代,信息爆炸帶來(lái)了海量的數(shù)據(jù)信息,而海量的數(shù)據(jù)信息給存儲(chǔ)系統(tǒng)帶來(lái)了極大的壓力。雖然現(xiàn)在用于存儲(chǔ)的計(jì)算機(jī)越來(lái)越多,性能越來(lái)越好,但是由于存儲(chǔ)介質(zhì)本身IO速度的限制,面對(duì)海量數(shù)據(jù)時(shí)仍然力不從心。
因此,現(xiàn)有技術(shù)中,海量數(shù)據(jù)存儲(chǔ)的第一步,是檢測(cè)和消除其中的相同數(shù)據(jù),即冗余數(shù)據(jù),在新數(shù)據(jù)入庫(kù)時(shí),通過對(duì)新數(shù)據(jù)和已存儲(chǔ)數(shù)據(jù)的比對(duì),清洗掉重復(fù)的數(shù)據(jù),只給其保留一個(gè)指針,指向該重復(fù)數(shù)據(jù)已存儲(chǔ)的存檔。這種做法一方面是減少存儲(chǔ)空間和IO帶寬的占用,另一方面是減少數(shù)據(jù)處理量。因此,海量數(shù)據(jù)存儲(chǔ)時(shí)的清洗比對(duì)入庫(kù)已經(jīng)是大規(guī)模數(shù)據(jù)存儲(chǔ)系統(tǒng)的必備技術(shù)。
但是,現(xiàn)有技術(shù)中的清洗比對(duì)入庫(kù)方法通常只是比較存儲(chǔ)文件的哈希值來(lái)檢測(cè)重復(fù)數(shù)據(jù)。但是單純以文件為單位來(lái)檢測(cè)重復(fù),其粒度太大,不能處理相似文件中的部分相同數(shù)據(jù),因此需要考慮減小粒度,能夠盡可能檢測(cè)相似文件間的部分重復(fù)數(shù)據(jù)。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)中的上述問題,本發(fā)明提出了一種清洗比對(duì)入庫(kù)方法,其技術(shù)方案如下:
一種清洗比對(duì)入庫(kù)方法,該方法包括如下步驟:
(1)入庫(kù)服務(wù)器接收需要存儲(chǔ)入庫(kù)的數(shù)據(jù)文件;
(2)所述入庫(kù)服務(wù)器檢查所述數(shù)據(jù)文件的長(zhǎng)度L,如果L小于預(yù)定義的最小數(shù)據(jù)塊長(zhǎng)度MinBlockLength,則提取該數(shù)據(jù)文件的最后一個(gè)字節(jié)B,轉(zhuǎn)到步驟3。如果L≥MinBlockLength,則轉(zhuǎn)到步驟5;
(3)預(yù)先給系統(tǒng)中的256個(gè)存儲(chǔ)服務(wù)器編號(hào),分別命名為Server(i),其中0≤i≤255,入庫(kù)服務(wù)器將該數(shù)據(jù)文件發(fā)送到Server(B),同時(shí)保存該數(shù)據(jù)文件的相關(guān)信息;
(4)所述Server(B)計(jì)算該數(shù)據(jù)文件的哈希值,根據(jù)該哈希值判斷該數(shù)據(jù)文件是否已存儲(chǔ)在服務(wù)器中,如果已存儲(chǔ),僅為該數(shù)據(jù)文件保留一個(gè)指針,指向已存儲(chǔ)的相同數(shù)據(jù);如果并未存儲(chǔ),則Server(B)存儲(chǔ)該數(shù)據(jù)文件和其哈希值,方法結(jié)束;
(5)所述入庫(kù)服務(wù)器設(shè)置初始的分塊向量V=0;
(6)所述入庫(kù)服務(wù)器從該數(shù)據(jù)文件的第MinBlockLength個(gè)字節(jié)開始向后掃描,當(dāng)掃描某個(gè)字節(jié)等于分塊向量時(shí),記錄該字節(jié)的位置P1,然后再?gòu)腜1+MinBlockLength的位置開始掃描,尋找并記錄下一個(gè)等于分塊向量的字節(jié)位置,如此反復(fù),直到數(shù)據(jù)文件的末尾;
(7)根據(jù)步驟6的所記錄的位置,將每個(gè)位置作為一個(gè)數(shù)據(jù)塊的結(jié)尾,對(duì)數(shù)據(jù)文件進(jìn)行分塊,由此得到了KV個(gè)數(shù)據(jù)塊;
(8)分塊向量V增加1,如果V≤255,則返回步驟6,否則繼續(xù)步驟9;
(9)對(duì)K0到K255按照從大到小進(jìn)行排序,獲取排在最前的5個(gè)值,假設(shè)為KV1,KV2,KV3,KV4,KV5;
(10)按照V1到V5五個(gè)分塊向量對(duì)該數(shù)據(jù)文件的分塊結(jié)果,將各個(gè)數(shù)據(jù)塊按照其結(jié)尾字節(jié)發(fā)送到相應(yīng)的存儲(chǔ)服務(wù)器進(jìn)行重復(fù)性檢測(cè);
(11)每個(gè)存儲(chǔ)服務(wù)器對(duì)接收到的每個(gè)數(shù)據(jù)塊,計(jì)算其哈希值,根據(jù)該哈希值判斷該數(shù)據(jù)塊是否是重復(fù)數(shù)據(jù),將判斷結(jié)果發(fā)送給入庫(kù)服務(wù)器;
(12)所述入庫(kù)服務(wù)器根據(jù)步驟11接收到的判斷結(jié)果,從五種分塊方式中選擇重復(fù)數(shù)據(jù)量最多的兩種,根據(jù)這兩種分塊方式,通知相應(yīng)的存儲(chǔ)服務(wù)器進(jìn)行存儲(chǔ),入庫(kù)服務(wù)器自身保存該數(shù)據(jù)文件的相關(guān)信息,包括其兩種分塊方式和相應(yīng)的存儲(chǔ)服務(wù)器。
進(jìn)一步地,所述入庫(kù)服務(wù)器是一個(gè)Web服務(wù)器,接收上傳的數(shù)據(jù)文件。
進(jìn)一步地,所述入庫(kù)服務(wù)器有多個(gè)。
進(jìn)一步地,所述MinBlockLength=1024字節(jié)。
進(jìn)一步地,同一存儲(chǔ)服務(wù)器復(fù)用多個(gè)服務(wù)器編號(hào)。
本發(fā)明的技術(shù)效果是:在清洗比對(duì)入庫(kù)時(shí),以較小的粒度進(jìn)行清洗比對(duì),提高了重復(fù)數(shù)據(jù)的發(fā)現(xiàn)率,降低了數(shù)據(jù)存儲(chǔ)的占用空間。
【附圖說(shuō)明】
此處所說(shuō)明的附圖是用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,但并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定,在附圖中:
圖1是本發(fā)明方法所應(yīng)用的系統(tǒng)結(jié)構(gòu)圖。
【具體實(shí)施方式】
下面將結(jié)合附圖以及具體實(shí)施例來(lái)詳細(xì)說(shuō)明本發(fā)明,其中的示意性實(shí)施例以及說(shuō)明僅用來(lái)解釋本發(fā)明,但并不作為對(duì)本發(fā)明的不當(dāng)限定。
參見附圖1,其示出了本發(fā)明方法所應(yīng)用的系統(tǒng)結(jié)構(gòu),該系統(tǒng)包括入庫(kù)服務(wù)器和多個(gè)存儲(chǔ)服務(wù)器,所述入庫(kù)服務(wù)器負(fù)責(zé)管理數(shù)據(jù)文件的清洗比對(duì)入庫(kù),而存儲(chǔ)服務(wù)器用于存儲(chǔ)數(shù)據(jù)。為了存儲(chǔ)海量的數(shù)據(jù),本發(fā)明的優(yōu)選方案是使用256個(gè)存儲(chǔ)服務(wù)器,當(dāng)然這是對(duì)于大型數(shù)據(jù)存儲(chǔ)系統(tǒng)而言的,如果使用者是小型企業(yè),為了減少成本,也可以考慮將其中的多個(gè)服務(wù)器合并成一個(gè),從而減少存儲(chǔ)服務(wù)器數(shù)量。
在上述系統(tǒng)結(jié)構(gòu)的基礎(chǔ)上,本發(fā)明方法的具體步驟如下:
(1)入庫(kù)服務(wù)器接收需要存儲(chǔ)入庫(kù)的數(shù)據(jù)文件。
入庫(kù)服務(wù)器作為整個(gè)系統(tǒng)與外界的接口,接收外界發(fā)送來(lái)的數(shù)據(jù)文件,并負(fù)責(zé)采用后續(xù)的步驟將該數(shù)據(jù)文件存儲(chǔ)到存儲(chǔ)服務(wù)器中。一個(gè)典型的例子是互聯(lián)網(wǎng)上的Web服務(wù)器相當(dāng)于入庫(kù)服務(wù)器,接收用戶上傳的數(shù)據(jù)文件并存儲(chǔ)。另外,本發(fā)明的入庫(kù)服務(wù)器也可以是多個(gè),本發(fā)明不對(duì)其數(shù)量做出限制。
(2)所述入庫(kù)服務(wù)器檢查所述數(shù)據(jù)文件的長(zhǎng)度L,如果L小于預(yù)定義的最小數(shù)據(jù)塊長(zhǎng)度MinBlockLength,則提取該數(shù)據(jù)文件的最后一個(gè)字節(jié)B,轉(zhuǎn)到步驟3。如果L≥MinBlockLength,則轉(zhuǎn)到步驟5。
上述長(zhǎng)度都是以字節(jié)為單位,由于一個(gè)字節(jié)為8位,則必然有0≤B≤255。所述最小數(shù)據(jù)塊長(zhǎng)度是本發(fā)明對(duì)文件分塊時(shí)的最小長(zhǎng)度,其具體值可以由管理員根據(jù)具體情況設(shè)定。一種優(yōu)選的情況下,該MinBlockLength=1024字節(jié)。
(3)預(yù)先給系統(tǒng)中的256個(gè)存儲(chǔ)服務(wù)器編號(hào),分別命名為Server(i),其中0≤i≤255,入庫(kù)服務(wù)器將該數(shù)據(jù)文件發(fā)送到Server(B),同時(shí)保存該數(shù)據(jù)文件的相關(guān)信息。
本發(fā)明根據(jù)數(shù)據(jù)塊結(jié)尾的字節(jié),對(duì)數(shù)據(jù)塊進(jìn)行分類,由于一個(gè)字節(jié)一共有256個(gè)取值,因此將數(shù)據(jù)塊分成256類,并且對(duì)應(yīng)的分配到256個(gè)存儲(chǔ)服務(wù)器,每個(gè)存儲(chǔ)服務(wù)器的編號(hào)與其負(fù)責(zé)的數(shù)據(jù)塊的分類(即結(jié)尾字節(jié)的值)相同。
256個(gè)存儲(chǔ)服務(wù)器是本發(fā)明的優(yōu)選方案,其實(shí)現(xiàn)成本較高,適用于大型的數(shù)據(jù)存儲(chǔ)系統(tǒng),如果需要縮減成本,存儲(chǔ)服務(wù)器之間可以進(jìn)行復(fù)用,即多個(gè)數(shù)據(jù)塊類別共享一個(gè)存儲(chǔ)服務(wù)器,該存儲(chǔ)服務(wù)器也就具有了多個(gè)編號(hào),這樣不影響本發(fā)明方法的具體實(shí)施過程。
所述數(shù)據(jù)文件的相關(guān)信息包括數(shù)據(jù)文件的名字、大小、存儲(chǔ)服務(wù)器的編號(hào)等等,由此入庫(kù)服務(wù)器可以查詢到該數(shù)據(jù)文件。
(4)所述Server(B)計(jì)算該數(shù)據(jù)文件的哈希值,根據(jù)該哈希值判斷該數(shù)據(jù)文件是否已存儲(chǔ)在服務(wù)器中,如果已存儲(chǔ),則該數(shù)據(jù)文件是重復(fù)數(shù)據(jù),僅為該數(shù)據(jù)文件保留一個(gè)指針,指向已存儲(chǔ)的數(shù)據(jù)即可;如果并未存儲(chǔ),則Server(B)存儲(chǔ)該數(shù)據(jù)文件和其哈希值,方法結(jié)束。
由于存儲(chǔ)服務(wù)器保存了每個(gè)存儲(chǔ)的數(shù)據(jù)文件或數(shù)據(jù)塊的哈希值,因此將該數(shù)據(jù)文件的哈希值與已有哈希值進(jìn)行比較,就可以判斷該數(shù)據(jù)文件是否是重復(fù)數(shù)據(jù),如果是重復(fù)數(shù)據(jù),就不用再次存儲(chǔ)整個(gè)數(shù)據(jù)文件。
(5)所述入庫(kù)服務(wù)器準(zhǔn)備對(duì)該數(shù)據(jù)文件進(jìn)行數(shù)據(jù)分塊,首先設(shè)置初始的分塊向量V=0.
(6)所述入庫(kù)服務(wù)器從該數(shù)據(jù)文件的第MinBlockLength個(gè)字節(jié)開始向后掃描,當(dāng)掃描某個(gè)字節(jié)等于分塊向量時(shí),記錄該字節(jié)的位置P1,然后再?gòu)腜1+MinBlockLength的位置開始掃描,尋找并記錄下一個(gè)等于分塊向量的字節(jié)位置,如此循環(huán),直到數(shù)據(jù)文件的末尾。換言之,每一次掃描的開始位置與上一次記錄位置的距離都是MinBlockLength,直到達(dá)到數(shù)據(jù)文件的末尾。
(7)根據(jù)步驟6的所記錄的位置,將每個(gè)位置作為一個(gè)數(shù)據(jù)塊的結(jié)尾,對(duì)數(shù)據(jù)文件進(jìn)行分塊,由此可以得到一個(gè)或多個(gè)數(shù)據(jù)塊,設(shè)得到了KV個(gè)數(shù)據(jù)塊。
步驟7得到的數(shù)據(jù)塊可能有兩類,第一類是以分塊向量V結(jié)尾的數(shù)據(jù)塊,第二類是數(shù)據(jù)文件的最后一個(gè)數(shù)據(jù)塊,即以B結(jié)尾的數(shù)據(jù)塊。其中第二類的數(shù)據(jù)塊的數(shù)量只能是1或者0,第一類數(shù)據(jù)塊的數(shù)據(jù)量也可能為0,這取決于數(shù)據(jù)文件的具體內(nèi)容。
(8)分塊向量V增加1,如果V≤255,則返回步驟6,否則繼續(xù)步驟9。
上述步驟6-8是一個(gè)循環(huán),基于0到255的每個(gè)分塊向量值進(jìn)行文件掃描,從而獲得了多種數(shù)據(jù)塊分割形式,數(shù)量從K0到K255。但是,本發(fā)明寫成循環(huán)的形式只是為了敘述方便,實(shí)際應(yīng)用中,本領(lǐng)域技術(shù)人員可以了解,可以只對(duì)數(shù)據(jù)文件進(jìn)行一遍掃描就完成上述256個(gè)循環(huán),從而提高執(zhí)行效率。
(9)對(duì)K0到K255按照從大到小進(jìn)行排序(如果有相等的KV,則下標(biāo)大的在前),獲取排在最前的(即最大的)5個(gè)值,假設(shè)為KV1,KV2,KV3,KV4,KV5。
(10)按照V1到V5五個(gè)分塊向量對(duì)該數(shù)據(jù)文件的分塊結(jié)果,將各個(gè)數(shù)據(jù)塊按照其結(jié)尾字節(jié)發(fā)送到相應(yīng)的存儲(chǔ)服務(wù)器進(jìn)行重復(fù)性檢測(cè)。
如前所述,如果一個(gè)數(shù)據(jù)塊的結(jié)尾字節(jié)是X,則將該數(shù)據(jù)塊發(fā)送到Server(X)。
(11)每個(gè)存儲(chǔ)服務(wù)器對(duì)接收到的每個(gè)數(shù)據(jù)塊,計(jì)算其哈希值,根據(jù)該哈希值判斷該數(shù)據(jù)塊是否是重復(fù)數(shù)據(jù)(即該數(shù)據(jù)塊與已存儲(chǔ)的數(shù)據(jù)塊相同),將判斷結(jié)果發(fā)送給入庫(kù)服務(wù)器。
(12)所述入庫(kù)服務(wù)器根據(jù)步驟11接收到的判斷結(jié)果,從五種分塊方式中選擇重復(fù)數(shù)據(jù)量最多的兩種(如果重復(fù)數(shù)據(jù)量相同,則隨機(jī)選擇)。根據(jù)這兩種分塊方式,通知相應(yīng)的存儲(chǔ)服務(wù)器進(jìn)行存儲(chǔ)。入庫(kù)服務(wù)器自身保存該數(shù)據(jù)文件的相關(guān)信息,包括其兩種分塊方式和相應(yīng)的存儲(chǔ)服務(wù)器。
存儲(chǔ)服務(wù)器的存儲(chǔ)方式與步驟4相同,如果是重復(fù)的數(shù)據(jù)塊,則只保留指針和相應(yīng)的哈希值,如果是不重復(fù)的數(shù)據(jù)塊,則保存該數(shù)據(jù)塊和相應(yīng)的哈希值。
保留的兩種分塊方式是為了冗余備份的考慮,即在一種分塊方式的存儲(chǔ)服務(wù)器出故障后,另外一種分塊方式仍然可以組合成原數(shù)據(jù)文件。
另外,上述步驟中,在五種分塊方式中選擇兩種僅僅是本發(fā)明的一種優(yōu)選的實(shí)施方式,本領(lǐng)域技術(shù)人員可以根據(jù)具體情況選擇另外的數(shù)值,例如從3種中選擇2種,或者5種中選擇3種。
以上所述僅是本發(fā)明的較佳實(shí)施方式,故凡依本發(fā)明專利申請(qǐng)范圍所述的構(gòu)造、特征及原理所做的等效變化或修飾,均包括于本發(fā)明專利申請(qǐng)范圍內(nèi)。