本申請涉及計算機
技術領域:
,尤其涉及數(shù)據(jù)壓縮方法,以及該方法對應的數(shù)據(jù)壓縮設備,以及用于執(zhí)行該方法的計算設備。
背景技術:
:壓縮技術被廣泛使用在數(shù)據(jù)存儲、數(shù)據(jù)傳輸?shù)阮I域,傳統(tǒng)壓縮技術包括了字典壓縮,又稱為AbrahamLempelandJacobZiv(簡稱:LZ)壓縮,以及Delta壓縮,又稱為相似壓縮。LZ壓縮以字節(jié)/字符串的粒度進行數(shù)據(jù)壓縮。以待壓縮的數(shù)據(jù)block為4MByte且窗口大小為4Byte為例,每次壓縮均使用當前窗口內(nèi)的4Byte與該待壓縮數(shù)據(jù)block的歷史數(shù)據(jù)進行匹配,如果該待壓縮數(shù)據(jù)block的歷史數(shù)據(jù)中存在與該4Byte數(shù)據(jù)相同的數(shù)據(jù),那么該4Byte數(shù)據(jù)對應的編碼只需要記錄該歷史數(shù)據(jù)的位置信息和長度,這樣在解壓縮的過程中,根據(jù)該4Byte數(shù)據(jù)對應的編碼以及該歷史數(shù)據(jù),就可以恢復出該4Byte數(shù)據(jù)。Delta壓縮與LZ壓縮不同之處在于,與待壓縮數(shù)據(jù)block的當前窗口內(nèi)的數(shù)據(jù)相匹配的是參考數(shù)據(jù)塊內(nèi)的數(shù)據(jù)。當前的Delta壓縮的壓縮速度仍有待提高。技術實現(xiàn)要素:本申請?zhí)峁┝艘环N數(shù)據(jù)壓縮方法,以提升數(shù)據(jù)壓縮的速度。本申請的第一方面,提供了一種數(shù)據(jù)壓縮方法,該數(shù)據(jù)壓縮方法可以由存儲控制器或數(shù)據(jù)壓縮設備執(zhí)行,以存儲控制器執(zhí)行為例。該方法包括:首先,存儲控制器分配存儲空間,該存儲空間的起始邏輯地址的末尾Nbit為0,N為大于1的整數(shù)。隨后,存儲控制器將參考數(shù)據(jù)塊存入該存儲空間,該參考數(shù)據(jù)塊的大小為2nByte,n不大于N。由于該參考數(shù)據(jù)塊的起始邏輯地址的末尾Nbit為0,則該參考數(shù)據(jù)塊的起始邏輯地址的有效部分均為0,該參考數(shù)據(jù)塊的起始邏輯地址的高于nbit的部分均為無效部分,因為參考數(shù)據(jù)塊的每個Byte數(shù)據(jù)的邏輯地址中高于nbit的部分均相同。隨后,存儲控制器執(zhí)行步驟1.1至步驟1.5以建立該參考數(shù)據(jù)塊對應的哈希表,該哈希表的key為該參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)進行哈希運算生成的哈希值,該哈希表的value包括該參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)的起始邏輯地址的末尾nbit,m為大于0的整數(shù)。執(zhí)行步驟1.1至步驟1.5以建立該參考數(shù)據(jù)塊對應的哈希表,該哈希表的key為該參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)進行哈希運算生成的哈希值,該哈希表的value包括該參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)的起始邏輯地址的末尾nbit,m為大于0的整數(shù)。步驟1.1,對該參考數(shù)據(jù)塊中第aByte數(shù)據(jù)到第a+mByte數(shù)據(jù)進行哈希運算生成第一哈希值,a為大于0的整數(shù)且首次執(zhí)行步驟1.1時a的取值為1;步驟1.2,判斷哈希表中是否存在與該第一哈希值相同的key;步驟1.3,若該哈希表中存在與該第一哈希值相同的key,根據(jù)該第aByte數(shù)據(jù)的邏輯地址的末尾nbit更新該哈希表中該第一哈希值對應的value;步驟1.4,若該哈希表中不存在與該第一哈希值相同的key,將該第一哈希值和該第aByte數(shù)據(jù)的邏輯地址的末尾nbit加入該哈希表;步驟1.5,判斷a是否等于(2n-m),若a等于(2n-m),該哈希表建立完畢,若a小于(n-m),a增加j且再次執(zhí)行步驟1.1至步驟1.5,j為大于0的正整數(shù)。通過循環(huán)執(zhí)行以上步驟,將該參考數(shù)據(jù)塊的窗口從第1Byte右移至最后1Byte,使得參考數(shù)據(jù)塊中每(m+1)Byte數(shù)據(jù)對應的第一哈希值和該(m+1)Byte數(shù)據(jù)的相對地址都會記錄在該哈希表中,以便后續(xù)使用該哈希表。在該哈希表建立完畢后,獲取待壓縮數(shù)據(jù),根據(jù)該哈希表確定該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)的窗口內(nèi)的(m+1)Byte數(shù)據(jù)相同的數(shù)據(jù)。根據(jù)該哈希表,可以確定待壓縮數(shù)據(jù)的窗口內(nèi)的數(shù)據(jù)與參考數(shù)據(jù)塊中的數(shù)據(jù)是否有重疊的部分,如果有重疊的部分,則可以根據(jù)該重疊的部分進行編碼。以上提供的數(shù)據(jù)壓縮方法中,通過將存儲參考數(shù)據(jù)塊的存儲空間的起始邏輯地址的末尾Nbit設置為0,簡化了該參考數(shù)據(jù)塊對應的哈希表的生成過程的復雜程度,提升了生成哈希表的效率,也即提升了壓縮效率。結合第一方面,在第一方面的第一種實現(xiàn)方式中,該根據(jù)該哈希表確定該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)的窗口內(nèi)的(m+1)Byte數(shù)據(jù)相同的數(shù)據(jù)包括多輪匹配處理,每輪匹配處理包括步驟2.1至2.4:步驟2.1,對該待壓縮數(shù)據(jù)中第bByte數(shù)據(jù)到第b+mByte數(shù)據(jù)進行哈希運算生成第二哈希值,b為大于0的整數(shù)且首輪匹配處理中b的取值為1;步驟2.2,判斷該哈希表中是否存在與該第二哈希值相同的key;步驟2.3,若該哈希表中存在與該第二哈希值相同的key,根據(jù)該哈希表中該第二哈希值對應的value,獲取該參考數(shù)據(jù)塊在本輪匹配處理中的匹配數(shù)據(jù),該本輪匹配處理中的匹配數(shù)據(jù)為該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)中第bByte后的數(shù)據(jù)相同的數(shù)據(jù);步驟2.4,若該哈希表中不存在與該第二哈希值相同的key,b增加stride,stride為大于0整數(shù)。步驟2.3和步驟2.4后,如果第b+mByte數(shù)據(jù)為該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù),則結束壓縮。通過上述步驟,獲取了待壓縮數(shù)據(jù)和參考數(shù)據(jù)塊相同的匹配數(shù)據(jù),以便生成壓縮編碼。結合第一方面的第一種實現(xiàn)方式,在第一方面的第二種實現(xiàn)方式中,該每輪匹配處理中stride的取值為:lit_len等于(本輪匹配處理中b的取值-B的取值-1),其中,上一輪匹配處理中的最后1Byte匹配數(shù)據(jù)為該待壓縮數(shù)據(jù)的第BByte數(shù)據(jù),P為大于0的整數(shù)。隨著匹配不上的數(shù)據(jù)的長度的增加,增加stride的取值能夠加快壓縮速度。而由于數(shù)據(jù)壓縮過程中,lit_len這一參數(shù)為生成壓縮編碼本來就必須維護的參數(shù),因此將stride取值為也沒有引進新的參數(shù),減輕了存儲控制器的工作負擔。本申請的第二方面,提供了一種數(shù)據(jù)壓縮設備,該數(shù)據(jù)壓縮設備用于執(zhí)行第一方面提供的數(shù)據(jù)壓縮方法。該設備包括:通信接口和處理芯片,該通信接口與該處理芯片相連;該處理芯片,用于分配存儲空間,該存儲空間的起始邏輯地址的末尾Nbit為0,N為大于1的整數(shù);該通信接口,用于接收參考數(shù)據(jù)塊,并將該參考數(shù)據(jù)塊存入該存儲空間,該參考數(shù)據(jù)塊的大小為2nByte,n不大于N;該處理芯片,還用于執(zhí)行步驟1.1至步驟1.5以建立該參考數(shù)據(jù)塊對應的哈希表,該哈希表的key為該參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)進行哈希運算生成的哈希值,該哈希表的value包括該參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)的起始邏輯地址的末尾nbit,m為大于0的整數(shù);步驟1.1,對該參考數(shù)據(jù)塊中第aByte數(shù)據(jù)到第a+mByte數(shù)據(jù)進行哈希運算生成第一哈希值,a為大于0的整數(shù)且首次執(zhí)行步驟1.1時a的取值為1;步驟1.2,判斷哈希表中是否存在與該第一哈希值相同的key;步驟1.3,若該哈希表中存在與該第一哈希值相同的key,根據(jù)該第aByte數(shù)據(jù)的邏輯地址的末尾nbit更新該哈希表中該第一哈希值對應的value;步驟1.4,若該哈希表中不存在與該第一哈希值相同的key,將該第一哈希值和該第aByte數(shù)據(jù)的邏輯地址的末尾nbit加入該哈希表;步驟1.5,判斷a是否等于(2n-m),若a等于(2n-m),該哈希表建立完畢,若a小于(n-m),a增加j且再次執(zhí)行步驟1.1至步驟1.5,j為大于0的正整數(shù);該處理芯片,還用于在該哈希表建立完畢后,獲取待壓縮數(shù)據(jù),根據(jù)該哈希表確定該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)的窗口內(nèi)的(m+1)Byte數(shù)據(jù)相同的數(shù)據(jù)。以上提供的數(shù)據(jù)壓縮設備,通過將存儲參考數(shù)據(jù)塊的存儲空間的起始邏輯地址的末尾Nbit設置為0,簡化了該參考數(shù)據(jù)塊對應的哈希表的生成過程的復雜程度,提升了生成哈希表的效率,也即提升了壓縮效率。結合第二方面,在第二方面的第一種實現(xiàn)方式中,該根據(jù)該哈希表確定該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)的窗口內(nèi)的(m+1)Byte數(shù)據(jù)相同的數(shù)據(jù)包括多輪匹配處理,每輪匹配處理包括步驟2.1至2.4:步驟2.1,對該待壓縮數(shù)據(jù)中第bByte數(shù)據(jù)到第b+mByte數(shù)據(jù)進行哈希運算生成第二哈希值,b為大于0的整數(shù)且首輪匹配處理中b的取值為1;步驟2.2,判斷該哈希表中是否存在與該第二哈希值相同的key;步驟2.3,若該哈希表中存在與該第二哈希值相同的key,根據(jù)該哈希表中該第二哈希值對應的value,獲取該參考數(shù)據(jù)塊在本輪匹配處理中的匹配數(shù)據(jù),該本輪匹配處理中的匹配數(shù)據(jù)為該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)中第bByte后的數(shù)據(jù)相同的數(shù)據(jù);步驟2.4,若該哈希表中不存在與該第二哈希值相同的key,b增加stride,stride為大于0整數(shù)。結合第二方面的第一種實現(xiàn)方式,在第二種實現(xiàn)方式中,每輪匹配處理中stride的取值為:lit_len等于(本輪匹配處理中b的取值-B的取值-1),其中,上一輪匹配處理中的最后1Byte匹配數(shù)據(jù)為該待壓縮數(shù)據(jù)的第BByte數(shù)據(jù),P為大于0的整數(shù)。隨著匹配不上的數(shù)據(jù)的長度的增加,增加stride的取值能夠加快壓縮速度。而由于數(shù)據(jù)壓縮過程中,lit_len這一參數(shù)為生成壓縮編碼本來就必須維護的參數(shù),因此本數(shù)據(jù)處理設備將stride取值為沒有引進新的參數(shù),減輕了工作負擔。本申請的第三方面提供了一種數(shù)據(jù)壓縮方法,該數(shù)據(jù)壓縮方法可以由存儲控制器或數(shù)據(jù)壓縮設備執(zhí)行。該方法包括:獲取待壓縮數(shù)據(jù)以及參考數(shù)據(jù)塊對應的哈希表;根據(jù)該哈希表確定該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)的窗口內(nèi)的(m+1)Byte數(shù)據(jù)相同的數(shù)據(jù),該確定過程包括多輪匹配處理,每輪匹配處理包括步驟3.1至3.4:步驟3.1,對該待壓縮數(shù)據(jù)中第bByte數(shù)據(jù)到第b+mByte數(shù)據(jù)進行哈希運算生成第二哈希值,b為大于0的整數(shù)且首輪匹配處理中b的取值為1;步驟3.2,判斷該哈希表中是否存在與該第二哈希值相同的key;步驟3.3,若該哈希表中存在與該第二哈希值相同的key,根據(jù)該哈希表中該第二哈希值對應的value,獲取該參考數(shù)據(jù)塊在本輪匹配處理中的匹配數(shù)據(jù),該本輪匹配處理中的匹配數(shù)據(jù)為該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)中第bByte后的數(shù)據(jù)相同的數(shù)據(jù);步驟3.4,若該哈希表中不存在與該第二哈希值相同的key,b增加stride,stride的取值為:lit_len等于(本輪匹配處理中b的取值-B的取值-1),其中,上一輪匹配處理中的最后1Byte匹配數(shù)據(jù)為該待壓縮數(shù)據(jù)的第BByte數(shù)據(jù),P為大于0的整數(shù)。隨著匹配不上的數(shù)據(jù)的長度的增加,增加stride的取值能夠加快壓縮速度。而由于數(shù)據(jù)壓縮過程中,lit_len這一參數(shù)為生成壓縮編碼本來就必須維護的參數(shù),因此本方法中將stride取值為沒有引進新的參數(shù),減輕了工作負擔。本申請第四方面提供了一種計算設備,該計算設備包括處理器、存儲器。該處理器和該存儲器通過總線建立通信連接,該處理器運行時讀取該存儲器中的程序,以執(zhí)行前述第一方面及第一方面任一實現(xiàn)方式提供的數(shù)據(jù)壓縮方法。本申請的第五方面,提供了一種存儲介質(zhì),該存儲介質(zhì)中存儲了程序代碼,該程序代碼被計算設備運行時,執(zhí)行第一方面及第一方面任一實現(xiàn)方式提供的數(shù)據(jù)壓縮方法。該存儲介質(zhì)包括但不限于快閃存儲器、硬盤(英文:harddiskdrive,縮寫:HDD)或固態(tài)硬盤(英文:solidstatedrive,縮寫:SSD)。本申請的第六方面,提供了一種計算機程序產(chǎn)品,該計算機程序產(chǎn)品可以為一個軟件安裝包,該軟件安裝包被計算設備運行時,執(zhí)行第一方面及第一方面任一實現(xiàn)方式提供的數(shù)據(jù)壓縮方法。附圖說明為了更清楚地說明本申請實施例的技術方案,下面將對實施例中所需要使用的附圖作以簡單地介紹,顯而易見的,下面描述中的附圖是本申請的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本申請實施例提供的系統(tǒng)示意圖;圖2為本申請實施例提供的另一系統(tǒng)示意圖;圖3-1為本申請實施例提供的數(shù)據(jù)壓縮方法的流程示意圖;圖3-2為本申請實施例提供的另一數(shù)據(jù)壓縮方法的流程示意圖;圖4為本申請實施例提供的數(shù)據(jù)壓縮設備的組織結構示意圖;圖5為本申請實施例提供的另一數(shù)據(jù)壓縮設備的組織結構示意圖;圖6為本申請實施例提供的計算設備的組織結構示意圖。具體實施方式下面結合本申請實施例中的附圖,對本申請實施例中的技術方案進行描述。本申請中采用術語第一、第二等來區(qū)分各個對象,但各個“第一”、“第二”之間不具有邏輯或時序上的依賴關系。本申請中第一哈希值指代對參考數(shù)據(jù)塊中(m+1)Byte數(shù)據(jù)進行哈希運算生成的哈希值,第二哈希值指代對待壓縮數(shù)據(jù)中(m+1)Byte數(shù)據(jù)進行哈希運算生成的哈希值。貫穿本說明書,在塊存儲的場景下,數(shù)據(jù)block指代固定大小的數(shù)據(jù),數(shù)據(jù)block的大小可以為4KByte、8KByte等;在文件存儲的場景下,數(shù)據(jù)block指代一個文件,其大小不固定。參考數(shù)據(jù)塊和待壓縮數(shù)據(jù)均由至少一個數(shù)據(jù)block構成。貫穿本說明書,當前數(shù)據(jù)的歷史數(shù)據(jù)指代:當前數(shù)據(jù)所在的參考數(shù)據(jù)塊或待壓縮數(shù)據(jù)中,邏輯地址位于該當前數(shù)據(jù)之前的數(shù)據(jù),或邏輯地址位于小于該當前數(shù)據(jù)的數(shù)據(jù)。例如對于某一參考數(shù)據(jù)塊中第aByte的數(shù)據(jù)而言,該參考數(shù)據(jù)塊中第1byte至第a-1Byte的數(shù)據(jù)均為其歷史數(shù)據(jù)。貫穿本說明書,清理(英文:clean)哈希表指代初始化哈希表,也即將哈希表內(nèi)存儲的數(shù)據(jù)歸0,以避免使用哈希表的過程發(fā)生誤匹配。貫穿本說明書,窗口包括了用于進行哈希運算的(m+1)Byte數(shù)據(jù)。窗口的起點為該(m+1)Byte數(shù)據(jù)的第1Byte,窗口的終點為該(m+1)Byte數(shù)據(jù)的最后1Byte,窗口的寬度為(m+1)。窗口包括的(m+1)Byte數(shù)據(jù)可以為參考數(shù)據(jù)塊中的數(shù)據(jù),也可以為待壓縮數(shù)據(jù)。在建立參考數(shù)據(jù)塊對應的哈希表的過程中,窗口的起點從該參考數(shù)據(jù)塊的第1Byte數(shù)據(jù)開始右移,對每個窗口內(nèi)包括的(m+1)Byte數(shù)據(jù)進行哈希運算以生成對應的哈希值,并填入到該參考數(shù)據(jù)塊對應的哈希表的key中。在窗口內(nèi)的數(shù)據(jù)為待壓縮數(shù)據(jù)的情況下,以待壓縮數(shù)據(jù)包括字符串“abcdefghijklmn”且m=3為例,窗口首先包括“abcd”,如果沒有與“abcd”匹配的參考數(shù)據(jù),則窗口右移。右移的步幅(英文:stride)可以自行設定,以步幅為1為例,則接下來使用“bcde”來生成哈希值。貫穿本說明書,邏輯地址指代操作系統(tǒng)分配的虛擬地址。任意(m+1)Byte數(shù)據(jù)的起始邏輯地址,也即該(m+1)Byte數(shù)據(jù)的首Byte數(shù)據(jù)的邏輯地址。貫穿本說明書,哈希表的value的長度的單位為Byte。貫穿本說明書,參考數(shù)據(jù)塊中任意1Byte數(shù)據(jù)的相對地址,指代該Byte數(shù)據(jù)相對于該Byte數(shù)據(jù)所在的參考數(shù)據(jù)塊的起始邏輯地址的偏移量。任意(m+1)Byte數(shù)據(jù)的相對地址,也即該(m+1)Byte數(shù)據(jù)的首Byte數(shù)據(jù)的相對地址。如果該(m+1)Byte數(shù)據(jù)所在的存儲空間的起始邏輯地址的末尾Nbit均為0且該(m+1)Byte數(shù)據(jù)所屬的參考數(shù)據(jù)塊的大小為2n,n不大于N,則該(m+1)Byte數(shù)據(jù)的首Byte數(shù)據(jù)的相對地址,也即該(m+1)Byte數(shù)據(jù)的首Byte數(shù)據(jù)的邏輯地址的末尾nbit。貫穿本說明書,或操作指代OR操作,也即只要A或B中之任一不為0,則AORB=1;如果A和B均為0,則AORB=0。貫穿本說明書,第aByte到第a+mByte數(shù)據(jù),指代包括第aByte、第a+mByte、第aByte數(shù)據(jù)和第a+mByte數(shù)據(jù)之間的數(shù)據(jù)。貫穿本說明書,指代對Z下取整,例如如果Z=4,則如果Z=3.5,則本申請實施例所應用的系統(tǒng)圖1為本申請實施例所應用的一個系統(tǒng)的示意圖,該系統(tǒng)包括了一個存儲陣列,該存儲陣列包括了至少一個存儲控制器和多個存儲設備,該存儲設備一般為非易失性存儲設備,具體可以為該快閃存儲器(英文:flashmemory)或硬盤(英文:harddiskdrive,縮寫:HDD)或固態(tài)硬盤(英文:solidstatedrive,縮寫:SSD)。每個存儲控制器與多個存儲設備相連接。為了節(jié)省存儲陣列中存儲設備的空間,該存儲控制器用于將待存儲的數(shù)據(jù)進行壓縮,將獲取的壓縮編碼存入存儲設備。圖2為本申請實施例所應用的另一系統(tǒng)的示意圖,該系統(tǒng)包括第一數(shù)據(jù)處理設備與第二數(shù)據(jù)處理設備。該第一數(shù)據(jù)處理設備中設置有數(shù)據(jù)壓縮設備,第二數(shù)據(jù)處理設備中設置有數(shù)據(jù)解壓縮設備。該數(shù)據(jù)壓縮設備對需要傳輸給該第二數(shù)據(jù)處理設備的數(shù)據(jù)進行壓縮,然后通過通信網(wǎng)絡將壓縮編碼傳輸至第二數(shù)據(jù)處理設備。數(shù)據(jù)解壓縮設備對該壓縮編碼進行解壓縮。因此,在通信網(wǎng)絡中僅需要傳輸壓縮編碼,減少了通信流量,加快了數(shù)據(jù)傳輸速度。該存儲控制器或該數(shù)據(jù)壓縮設備運行時執(zhí)行圖3-1和圖3-2提供的數(shù)據(jù)壓縮方法。本申請還提供了一種數(shù)據(jù)壓縮方法,以存儲控制器執(zhí)行本方法為例,其流程示意圖包括兩部分,分別如圖3-1和圖3-2所示。其中,圖3-1介紹了為參考數(shù)據(jù)塊建立哈希表的過程,圖3-2介紹了利用已建立的哈希表對待壓縮數(shù)據(jù)進行壓縮的過程。步驟202,分配第一存儲空間,該第一存儲空間用于存儲參考數(shù)據(jù)塊,該第一存儲空間的起始邏輯地址的末尾Nbit為0,N為大于1的整數(shù)。以N為32且該存儲控制器采用64位的操作系統(tǒng)為例,該第一存儲空間的起始邏輯地址為0xFFFFFFFF00000000。步驟204,分配第二存儲空間,該第二存儲空間用于存儲該參考數(shù)據(jù)塊對應的哈希表。該哈希表可以采用key-value結構,每個key為對窗口內(nèi)(m+1)Byte參考數(shù)據(jù)塊中的數(shù)據(jù)進行哈希運算后獲取的哈希值,每個key對應的value包括生成該key的(m+1)Byte數(shù)據(jù)的起始邏輯地址的末尾nbit,其結構如表1所示。KeyValueHashvalue1邏輯地址1的末尾nbitHashvalue2邏輯地址2的末尾nbit……HashvalueN邏輯地址N的末尾nbit表1假設hashvalue1為參考數(shù)據(jù)塊中對第aByte至第a+mByte數(shù)據(jù)進行哈希運算得到的哈希值,則邏輯地址1為第aByte數(shù)據(jù)的邏輯地址,表1中的其余行依此類推。步驟206,獲取參考數(shù)據(jù)塊,并將該參考數(shù)據(jù)塊存入該第一存儲空間,該待壓縮數(shù)據(jù)的大小為2nByte,n不大于N。因此,該參考數(shù)據(jù)塊的起始邏輯地址的末尾Nbit為0。步驟208,清理該哈希表。步驟208可以在步驟204之后,步驟210之前任意時刻執(zhí)行。步驟210,根據(jù)該參考數(shù)據(jù)塊的第aByte到第a+mByte生成第一哈希值,a為大于0的整數(shù)。第一次執(zhí)行步驟210時,a取值為1。常見的m的取值包括:2、3、4、5、6或7等。步驟212,判斷該哈希表中是否存在與該第一哈希值相同的key,如果存在,執(zhí)行步驟2141至步驟2142,如果不存在,執(zhí)行步驟2143至步驟2144。步驟2141,根據(jù)該參考數(shù)據(jù)塊的第aByte數(shù)據(jù)的邏輯地址的末尾nbit更新該第一哈希值所在行的value。步驟2142,判斷第a+mByte是否為參考數(shù)據(jù)塊的最后1Byte,也即判斷a是否等于(2n-m),如果a等于(2n-m),結束該哈希表的生成,如果a小于(2n-m),則將生成第一哈希值的窗口右移,即a=a+j,j為大于0的整數(shù),并返回步驟210。應當說明的是,可能a小于(2n-m),但a+j大于(2n-m),此種情況下,步驟2142中也應該結束該哈希表的生成。步驟2143,將該第一哈希值和該參考數(shù)據(jù)塊的第aByte數(shù)據(jù)的邏輯地址的末尾nbit加入至該哈希表。步驟2144,判斷第a+mByte是否為參考數(shù)據(jù)塊的最后1Byte,也即判斷a是否等于(2n-m),如果a等于(2n-m),結束該哈希表的生成,如果a小于(2n-m),則將生成第一哈希值的窗口右移,即a=a+j,并返回步驟210。應當說明的是,可能a小于(2n-m),但a+j大于(2n-m),此種情況下,步驟2142中也應該結束該哈希表的生成。下面以N為32、n為16且該存儲控制器采用64位的操作系統(tǒng)為例,詳細分析本申請?zhí)峁┑膲嚎s方法相對于現(xiàn)有壓縮方法的提升。其中采用本申請?zhí)峁┑姆椒ǚ峙涞牡谝淮鎯臻g的起始邏輯地址為0xFFFFFFFF00000000。表2如表2,當前邏輯地址為當前進行哈希運算的(m+1)Byte數(shù)據(jù)的起始邏輯地址。如果第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)對應的第一哈希值已經(jīng)存在于該哈希表中的某一行的key,則需要讀取該哈希表中該第一哈希值所在行的value,并用該第aByte數(shù)據(jù)的相對地址更新該第一哈希值所在行的value,也即需要進行一次讀哈希表和一次寫哈希表?,F(xiàn)有技術中,以該第一哈希值所在行的value記錄400為例,為了獲取被匹配上的參考數(shù)據(jù)塊中的數(shù)據(jù)的完整起始邏輯地址,因此需要將400與0xFFFFFFFF00000001進行加操作,獲取0xFFFFFFFF00000191。0xFFFFFFFF00000191為與當前進行哈希運算的(m+1)Byte數(shù)據(jù)相同的參考數(shù)據(jù)塊中的數(shù)據(jù)的起始邏輯地址。同時,現(xiàn)有技術中為了對該第一哈希值所在行的value進行更新,需要將當前進行哈希運算的(m+1)Byte數(shù)據(jù)的相對地址存入該被匹配上的行的value,因此需要將0xFFFFFFFF000007D1與0xFFFFFFFF00000001進行減操作,獲取2000,并用2000更新該第一哈希值所在行的value。由此可見,現(xiàn)有技術中,如果當前進行哈希運算的(m+1)Byte數(shù)據(jù)對應的第一哈希值已經(jīng)存在于該哈希表,則需要進行一次加操作和一次減操作。與之對應的,本申請?zhí)峁┑膲嚎s方法中,以該第一哈希值所在行的value記錄0x0190為例,為了獲取被匹配上的參考數(shù)據(jù)塊中的數(shù)據(jù)的完整起始邏輯地址,因此需要將0x0190與0xFFFFFFFF00000000進行或操作,獲取0xFFFFFFFF00000190。0xFFFFFFFF00000190為與當前進行哈希運算的(m+1)Byte數(shù)據(jù)相同的參考數(shù)據(jù)塊中的數(shù)據(jù)的起始邏輯地址。同時,本申請?zhí)峁┑膲嚎s方法中為了對該第一哈希值所在行的value進行更新,需要用當前進行哈希運算的(m+1)Byte數(shù)據(jù)的起始邏輯地址的末尾nbit更新該第一哈希值所在行的value,由于該參考數(shù)據(jù)塊的起始邏輯地址的末尾Nbit為0,因此直接用07D0更新該被匹配上的行的value即可。由此可見,本申請?zhí)峁┑膲嚎s方法中,如果當前進行哈希運算的(m+1)Byte數(shù)據(jù)對應的第一哈希值已經(jīng)存在于該哈希表,僅需要進行一次或操作。相對于現(xiàn)有技術中需要使用一次加操作和一次減操作,降低了操作所需的時間,提升了生成參考塊對應的哈希表的效率,也即提升了壓縮效率。如果第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)對應的第一哈希值不存在于該哈希表中的任一行的key,也即該第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)對應的第一哈希值不能夠匹配該哈希表中的任一行的key,將該第aByte數(shù)據(jù)到第a+mByte對應的第一哈希值,以及該參考數(shù)據(jù)塊的第aByte數(shù)據(jù)的相對地址加入至該哈希表,也即需要進行一次寫哈希表。寫哈希表的場景中,現(xiàn)有技術中需要將0xFFFFFFFF000007D1與0xFFFFFFFF00000001進行減操作,獲取2000。隨后,將第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)對應的第一哈希值和2000存入該哈希表。與之對應的,本申請?zhí)峁┑膲嚎s方法中,以第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)的起始邏輯地址為0xFFFFFFFF000007D0為例,將第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)對應的第一哈希值和0x07D0存入該哈希表。由此可見,本申請?zhí)峁┑膲嚎s方法中,如果當前進行哈希運算的(m+1)Byte數(shù)據(jù)對應的第一哈希值不存在于該哈希表中的任一行的key,直接將該第aByte數(shù)據(jù)到第a+mByte的數(shù)據(jù)的起始邏輯地址的末尾nbit寫入該哈希表。相對于現(xiàn)有技術中需要使用一次減操作和一次寫操作,降低了操作所需的時間,提升了生成參考數(shù)據(jù)塊對應的哈希表的效率,也即提升了壓縮效率。由于存儲控制器中一般會存儲有多個參考數(shù)據(jù)塊,針對每個參考數(shù)據(jù)塊均可以執(zhí)行以上圖3-1對應的步驟以生成該參考數(shù)據(jù)塊對應的哈希表。為此,存儲每個參考數(shù)據(jù)塊的存儲空間的末尾Nbit均需要為0。因此,可以為每個參考數(shù)據(jù)塊均開辟一個末尾Nbit為0的第一存儲空間?;騼H在步驟202中開辟一個末尾Nbit為0的第一存儲空間,隨后在步驟2142或步驟2144中生成一個參考數(shù)據(jù)塊對應的哈希表后,清理該第一存儲空間以存儲下一個參考數(shù)據(jù)塊。步驟402,分配第三存儲空間,該第三存儲空間用于存儲待壓縮數(shù)據(jù)。步驟404,分配第四存儲空間,該第四存儲空間用于存儲待壓縮的數(shù)據(jù)在壓縮過程中生成的壓縮編碼。通過對該壓縮編碼進行解壓操作可以復原待壓縮數(shù)據(jù)。步驟402、步驟404可以以任意順序執(zhí)行順序。步驟402、步驟404的執(zhí)行也可以與步驟202或步驟204一同執(zhí)行,以一次性分配數(shù)據(jù)壓縮所需的全部存儲空間。該第一存儲空間、該第二存儲空間、該第三存儲空間和該第四存儲空間可以指代內(nèi)存空間。由于該第二存儲空間、該第三存儲空間和該第四存儲空間的起始邏輯地址的末尾Nbit無須設置為0,因此該第二存儲空間、該第三存儲空間和該第四存儲空間也可以合并為一個存儲空間或其中任意兩個合并為一個存儲空間。步驟406,接收待壓縮數(shù)據(jù),并將該待壓縮數(shù)據(jù)存入該第三存儲空間。該待壓縮數(shù)據(jù)可以包括多個數(shù)據(jù)block。相比于待壓縮數(shù)據(jù)僅包括一個數(shù)據(jù)block的方案,一次性將多個數(shù)據(jù)block存入該第一存儲空間,可以避免多次清理哈希表帶來的性能損耗,因此可以提升壓縮率。存儲控制器從客戶端或其他設備獲取待壓縮數(shù)據(jù),該待壓縮數(shù)據(jù)為準備寫入存儲設備中的數(shù)據(jù)。步驟408,從多個參考數(shù)據(jù)塊中選擇一個參考數(shù)據(jù)塊,獲取該參考數(shù)據(jù)塊對應的哈希表。采用Delta壓縮的存儲控制器中一般會存有多個參考數(shù)據(jù)塊及每個參考數(shù)據(jù)塊對應的哈希表。因此,在接收到待壓縮數(shù)據(jù)后,需要通過相似度計算,指紋計算等方式從這多個參考數(shù)據(jù)塊中選擇一個與待壓縮數(shù)據(jù)塊最相似的參考數(shù)據(jù)塊用于后續(xù)的步驟。如果存儲控制器中僅存有一個參考數(shù)據(jù)塊,則無須步驟408。步驟408后,執(zhí)行多輪匹配處理,每輪匹配處理均包括步驟410及步驟410后的分支之一,直至窗口向右滑動至該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù)。步驟410,根據(jù)待壓縮數(shù)據(jù)的第bByte到第b+mByte生成第二哈希值,b為大于0的整數(shù)。第一次執(zhí)行步驟410時,b取值為1。步驟412,判斷該哈希表中是否存在與該第二哈希值相同的key,如果存在,則執(zhí)行包括步驟4141的分支,如果不存在,則執(zhí)行包括步驟416的分支。步驟412中使用的哈希表為步驟408中選擇出的參考數(shù)據(jù)塊對應的哈希表。步驟4141,獲取該哈希值所在行的value,并根據(jù)該哈希值所在行的value獲取參考數(shù)據(jù)塊中的數(shù)據(jù)。步驟4142,將獲取到的參考數(shù)據(jù)塊中的數(shù)據(jù)與當前進行哈希運算的(m+1)Byte數(shù)據(jù)向右逐字節(jié)進行匹配,獲取該參考數(shù)據(jù)塊在本輪匹配處理中的匹配數(shù)據(jù),本輪匹配處理中的匹配數(shù)據(jù)為該參考數(shù)據(jù)塊中與該待壓縮數(shù)據(jù)中第bByte后的數(shù)據(jù)相同的數(shù)據(jù)。步驟4143,根據(jù)該本輪匹配處理中的匹配數(shù)據(jù)生成本輪匹配處理對應的壓縮編碼,并將該壓縮編碼存入該第四存儲空間內(nèi)。步驟4144,判斷第b+mByte是否為該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù)。如果第b+mByte不是該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù),則b增加k,也即b+=k,并返回執(zhí)行步驟410以進行下一輪的匹配處理其中,k為預設的整數(shù)且用于在每完成一次匹配后,將待壓縮數(shù)據(jù)塊的窗口右移以對后續(xù)數(shù)據(jù)進行哈希運算。如果第b+mByte是該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù),則結束壓縮,將該第四存儲空間內(nèi)的壓縮編碼存入存儲設備。該壓縮編碼包括了:匹配長度,本輪匹配處理中的匹配數(shù)據(jù)的相對地址,以及上一輪匹配處理中的最后1Byte匹配數(shù)據(jù)至本輪匹配處理的窗口中第1Byte數(shù)據(jù)之間的數(shù)據(jù)。如果存在多個參考數(shù)據(jù)塊的場景下,該壓縮編碼中可能還需要攜帶指示步驟408中選擇出的參考數(shù)據(jù)塊對應的標識。例如參考數(shù)據(jù)塊包括abcdefghHUT,假設第一個a為的相對地址為100。而待壓縮數(shù)據(jù)包括abcdef,且當前窗口包括abcd,如表3。KeyValueabcd對應的hash值100bcde對應的hash值101cdef對應的hash值102defg對應的hash值103efgh對應的hash值104fghH對應的hash值105ghHU對應的hash值106hHUT對應的hash值107表3當獲取abcd對應的hash值后,由于在該哈希表中能夠匹配上第一行的key,因此根據(jù)哈希表中第一行的value讀取參考數(shù)據(jù)塊中的a,然后待壓縮數(shù)據(jù)中的第1個字符與參考數(shù)據(jù)塊中的a相比較,待壓縮數(shù)據(jù)中第2個字符與參考數(shù)據(jù)塊中的b相比較,依次類推,直至向右匹配至無法匹配為止。在本例中,待壓縮數(shù)據(jù)中第1個字符至第6個字符與參考數(shù)據(jù)塊中第1至第6個字符相同。因此生成的壓縮編碼包括:上次壓縮編碼記錄的最后1Byte數(shù)據(jù)至本輪匹配處理中匹配上的第1Byte之間的數(shù)據(jù),100,6。其中100為當前窗口內(nèi)的待壓縮數(shù)據(jù)匹配上的參考數(shù)據(jù)的相對地址,6為匹配數(shù)據(jù)的長度。lit_len等于(本輪匹配處理中b的取值-B),上一輪匹配處理中的最后1Byte匹配數(shù)據(jù)為該待壓縮數(shù)據(jù)的第BByte數(shù)據(jù)。例如,上一輪匹配處理中,待壓縮數(shù)據(jù)的第100Byte至第120Byte數(shù)據(jù)與參考數(shù)據(jù)塊中的數(shù)據(jù)匹配成功,本輪匹配處理中b等于132,則本輪匹配處理中l(wèi)it_len等于12,即(132-120)。步驟416,判斷第b+mByte是否為該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù)。如果第b+mByte不是該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù),則b增加stride,也即b+=stride,并返回執(zhí)行步驟410以進行下一輪的匹配處理,其中stride等于P為大于0的預設的整數(shù)。如果第b+mByte是該待壓縮數(shù)據(jù)的最后1Byte數(shù)據(jù),則結束壓縮,將該第四存儲空間內(nèi)的壓縮編碼存入存儲設備。在步驟416中,由于本輪匹配處理中生成的第二哈希值無法匹配該哈希表中任一key,因此如果本輪匹配處理的窗口沒有右移到該待壓縮數(shù)據(jù)的末尾,則步驟416后需要將窗口右移strideByte以繼續(xù)執(zhí)行步驟410。如果在匹配處理的過程中連續(xù)多個窗口生成的第二哈希值無法匹配該哈希表中的任一key,則需要適當增加stride的取值,以加快窗口右移的速度,提升壓縮效率。而隨著連續(xù)無法匹配的窗口的增加,lit_len的取值也會隨之而增加。將stride取值為既保證了stride的取值不小于1,窗口可以順利右移,又使得隨著lit_len的取值的增加,stride的取值也會隨著增加,加快了窗口右移的速度。而P的取值越小,stride的增加速度越快,示例性的,P可以取值為64。同時,由于數(shù)據(jù)壓縮過程中,lit_len這一參數(shù)為生成壓縮編碼本來就必須維護的參數(shù),因此將stride取值為也沒有引進新的參數(shù),減輕了存儲控制器的工作負擔。需要說明的是,圖3-1介紹的為參考數(shù)據(jù)塊建立哈希表的過程與圖3-2介紹的利用已建立的哈希表對待壓縮數(shù)據(jù)進行壓縮的過程除了可以聯(lián)合使用于一個數(shù)據(jù)壓縮方法中,兩者還可以獨立使用。也即,可以僅使用圖3-1介紹的為參考數(shù)據(jù)塊建立哈希表的過程,而不采用圖3-2對應的如何使用已建立的哈希表的過程?;?,僅使用圖3-2介紹的利用已建立的哈希表對待壓縮數(shù)據(jù)進行壓縮的過程,而不采用圖3-1對應的為參考數(shù)據(jù)塊建立哈希表的過程。如圖4所示,本申請還提供了一種數(shù)據(jù)壓縮設備400,該數(shù)據(jù)壓縮設備可以為圖1中的存儲控制器或圖2中的數(shù)據(jù)壓縮設備。該數(shù)據(jù)壓縮設備400包括通信接口402和處理芯片404,通信接口402和處理芯片404建立通信連接。該數(shù)據(jù)壓縮設備400運行時,執(zhí)行圖3-1和圖3-2對應的數(shù)據(jù)壓縮方法。通信接口402用于與外部設備通信,例如寫入待壓縮數(shù)據(jù)和參考數(shù)據(jù)塊的客戶端、存儲陣列中的存儲設備、通信網(wǎng)絡中的網(wǎng)絡設備等。通信接口402可以為數(shù)據(jù)壓縮設備400的輸入/輸出接口。通信接口402具體用于執(zhí)行步驟206中獲取參考數(shù)據(jù)塊的步驟,以及步驟406中接收待壓縮數(shù)據(jù)的部分,以及步驟4144和步驟416之后將第四存儲空間內(nèi)的壓縮編碼存入存儲設備的步驟。如果該數(shù)據(jù)壓縮設備400為圖2中的數(shù)據(jù)壓縮設備,則步驟4144和步驟416之后,通信接口402用于將該第四存儲空間內(nèi)的壓縮編碼發(fā)往通信網(wǎng)絡。處理芯片404,用于執(zhí)行圖3-1和圖3-2中的其余步驟。處理芯片404可以通過專用集成電路(英文:application-specificintegratedcircuit,縮寫:ASIC)實現(xiàn),或可編程邏輯器件(英文:programmablelogicdevice,縮寫:PLD)實現(xiàn)。上述PLD可以是復雜可編程邏輯器件(英文:complexprogrammablelogicdevice,縮寫:CPLD),現(xiàn)場可編程門陣列(英文:fieldprogrammablegatearray,縮寫:FPGA),通用陣列邏輯(英文:genericarraylogic,縮寫:GAL)或其任意組合。如圖5所示,處理芯片404還可以通過處理器、存儲設備以及邏輯芯片實現(xiàn),該邏輯芯片可以由PLD或ASIC實現(xiàn)。該處理芯片404運行時,該處理器和該邏輯芯片各執(zhí)行一部分功能,兩者功能的分配可以有多種。示例性的,由該處理器讀取該存儲器中的代碼執(zhí)行分配各個存儲空間以及將參考數(shù)據(jù)塊和待壓縮數(shù)據(jù)存入對應的存儲空間。在各個存儲空間均已在該存儲器中分配完畢,并且參考數(shù)據(jù)塊和待存儲數(shù)據(jù)已經(jīng)存儲如對應的存儲空間后,由該邏輯芯片完成后續(xù)步驟。以上提供的數(shù)據(jù)壓縮設備,通過將存儲參考數(shù)據(jù)塊存儲空間的末尾Nbit地址設置為0,使得后續(xù)建立該參考數(shù)據(jù)塊對應的哈希表的過程更加簡單,提升了壓縮速度。圖6為本申請?zhí)峁┑囊环N計算設備,該計算設備600可以為圖1中的存儲控制器或圖2中的數(shù)據(jù)壓縮設備。計算設備600包括處理器602、存儲器604,還可以包括總線606以及通信接口608。通信接口608用于與外部設備通信,例如寫入待壓縮數(shù)據(jù)的客戶端、存儲陣列中的存儲設備、通信網(wǎng)絡中的網(wǎng)絡設備等。通信接口608可以為計算設備600的輸入/輸出接口。處理器602、存儲器604和通信接口608可以通過總線606實現(xiàn)彼此之間的通信連接,也可以通過無線傳輸?shù)绕渌侄螌崿F(xiàn)通信。處理器602可以為中央處理器(英文:centralprocessingunit,縮寫:CPU)。存儲器604可以包括易失性存儲器(英文:volatilememory),例如隨機存取存儲器(英文:random-accessmemory,縮寫:RAM)??蛇x的,存儲器604還可以包括非易失性存儲器(英文:non-volatilememory),例如只讀存儲器(英文:read-onlymemory,縮寫:ROM),快閃存儲器,HDD或SSD;存儲器604還可以包括上述種類的存儲器的組合。當計算設備600為圖1中的存儲控制器時,由于存儲控制器與存儲陣列中的多個存儲設備相連,因此存儲器604也可以不包括非易失性存儲器,計算設備600的非易失性存儲器由存儲陣列的存儲設備提供。當計算設備600為圖2中的數(shù)據(jù)壓縮設備時,由于其可以直接將壓縮編碼發(fā)往通信網(wǎng)絡,不需要將壓縮編碼存入非易失性存儲器,因此存儲器604也可以不包括非易失性存儲器。在通過軟件來實現(xiàn)本申請?zhí)峁┑募夹g方案時,用于實現(xiàn)本申請圖3-1和圖3-2提供的數(shù)據(jù)壓縮方法的程序代碼保存在存儲器604中,并由處理器602來執(zhí)行。以上提供的計算設備,通過將存儲參考數(shù)據(jù)塊存儲空間的末尾Nbit地址設置為0,使得后續(xù)建立該參考數(shù)據(jù)塊對應的哈希表的過程更加簡單,提升了壓縮速度。在上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。結合本申請公開內(nèi)容所描述的方法可以由處理器執(zhí)行軟件指令的方式來實現(xiàn)。軟件指令可以由相應的軟件模塊組成,軟件模塊可以被存放于RAM、快閃存儲器、ROM、可擦除可編程只讀存儲器(英文:erasableprogrammablereadonlymemory,縮寫:EPROM)、電可擦可編程只讀存儲器(英文:electricallyerasableprogrammablereadonlymemory,縮寫:EEPROM)、硬盤、SSD、光盤或者本領域熟知的任何其它形式的存儲介質(zhì)中。本領域技術人員應該可以意識到,在上述一個或多個示例中,本申請所描述的功能可以用硬件或軟件來實現(xiàn)。當使用軟件實現(xiàn)時,可以將這些功能存儲在計算機可讀介質(zhì)中或者作為計算機可讀介質(zhì)上的一個或多個指令或代碼進行傳輸。存儲介質(zhì)可以是通用或?qū)S糜嬎銠C能夠存取的任何可用介質(zhì)。以上該的具體實施方式,對本申請的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上該僅為本申請的具體實施方式而已,并不用于限定本申請的保護范圍,凡在本申請的技術方案的基礎之上,所做的任何修改、改進等,均應包括在本申請的保護范圍之內(nèi)。當前第1頁1 2 3