專利名稱:用于數(shù)據(jù)去重復的可縮放塊存儲的制作方法
技術領域:
本發(fā)明涉及存儲數(shù)據(jù)的方法,尤其涉及用戶數(shù)據(jù)去重復的可縮放存儲方法和系統(tǒng)。
背景技術:
數(shù)據(jù)去重復,也稱為數(shù)據(jù)優(yōu)化,是減少需要存儲在盤上或需要通過網絡上進行傳送的數(shù)據(jù)的物理字節(jié)量的動作,而不會損害原始數(shù)據(jù)的保真性和完整性。數(shù)據(jù)去重復減少了存儲數(shù)據(jù)所需的存儲容量,并且可因此導致存儲硬件成本和數(shù)據(jù)管理成本方面的節(jié)省。 數(shù)據(jù)去重復提供了處理快速增長的數(shù)字存儲數(shù)據(jù)的解決方案。數(shù)據(jù)去重復可根據(jù)用于消除各持久存儲文件之內或之間的重復的一項或多項技術來執(zhí)行。例如,根據(jù)一項技術,在一個或多個文件中出現(xiàn)多次的唯一數(shù)據(jù)區(qū)域可被標識, 并且這些所標識的唯一數(shù)據(jù)區(qū)域的單一副本可被物理地存儲??纱鎯@些所標識的唯一數(shù)據(jù)區(qū)域(也稱為數(shù)據(jù)“塊”)的引用,引用指示了包含這些唯一數(shù)據(jù)區(qū)域的各文件以及在這些文件中的位置。該技術一般稱為單一實例化。除了單一實例化以外,還可執(zhí)行對數(shù)據(jù)的壓縮。其他數(shù)據(jù)減少技術也可被實現(xiàn)為數(shù)據(jù)去重復解決方案的一部分。管理根據(jù)數(shù)據(jù)去重復技術來存儲的數(shù)據(jù)存在各種困難。例如,由于由數(shù)據(jù)去重復所施加的數(shù)據(jù)碎片,在訪問根據(jù)去重復來存儲的文件時存在等待時間。該等待時間限制了對數(shù)據(jù)去重復解決方案的采用,尤其是在主存儲數(shù)據(jù)上的采用,因為在主存儲數(shù)據(jù)中用戶期望對文件的無縫的、快速的訪問。而且,數(shù)據(jù)去重復算法可在專用裝置上運行,或者在存儲和服務數(shù)據(jù)的設備(例如,文件服務器)上運行。在文件服務器的示例中,數(shù)據(jù)去重復可能不是該設備的主要功能,并且因此可能需要數(shù)據(jù)去重復技術是高效的,以免過度消耗設備資源(例如,存儲器、輸入/輸出(I/O)機制、中央處理單元(CPU)能力等)。而且,由于數(shù)字數(shù)據(jù)量的以非常高的速度增長,存儲設備(例如,存儲盤)的大小以及與計算設備相關聯(lián)的總存儲容量也必須增大,從而導致不能對增加的存儲量進行很好地縮放的數(shù)據(jù)去重復技術的困難。
發(fā)明內容
提供本發(fā)明內容是為了以精簡的形式介紹將在以下具體實施方式
中進一步描述的一些概念。本發(fā)明內容并不旨在標識所要求保護主題的關鍵特征或必要特征,也不旨在用于限制所要求保護主題的范圍。提供了用于本地化存儲中的數(shù)據(jù)塊、用于定位所存儲的數(shù)據(jù)塊、用于存儲數(shù)據(jù)流、 以及用于重組織已存儲的數(shù)據(jù)流的方法、系統(tǒng)和計算程序產品。例如,提供了用于本地化存儲中的數(shù)據(jù)塊的各種實現(xiàn)。數(shù)據(jù)流被解析成數(shù)據(jù)塊序列。確定數(shù)據(jù)塊序列中的任何一個數(shù)據(jù)塊是否被存儲在包括多個數(shù)據(jù)塊的塊容器中。以相鄰的排列并以塊容器中與數(shù)據(jù)流中的順序相同順序來存儲數(shù)據(jù)塊序列中被確定為沒有存儲在塊容器內的數(shù)據(jù)塊。為數(shù)據(jù)塊序列中的每一數(shù)據(jù)塊生成元數(shù)據(jù)。數(shù)據(jù)塊序列中的數(shù)據(jù)塊的元數(shù)據(jù)包括該數(shù)據(jù)塊在數(shù)據(jù)流中的偏移、指向該數(shù)據(jù)塊在塊容器內的位置的指針、以及該數(shù)據(jù)塊的位置指示符。為包括所生成的元數(shù)據(jù)的數(shù)據(jù)流生成流映射。將該流映射存儲在流容器中。而且,提供了用于可靠地定位存儲中的數(shù)據(jù)塊的實現(xiàn)。對數(shù)據(jù)塊的請求被接收。該請求包括數(shù)據(jù)塊的標識符。數(shù)據(jù)塊標識符包括塊容器標識符、局部標識符、塊容器階段值、 和第一塊偏移值。塊容器標識符用于定位塊容器。如果塊容器的階段指示匹配于塊容器階段值,則可使用第一塊偏移值在塊容器中定位數(shù)據(jù)塊。如果塊容器的階段指示不匹配于塊容器階段值,則使用與塊容器相關聯(lián)的重定向表來定位數(shù)據(jù)塊??伤阉髦囟ㄏ虮硪缘玫桨ū镜貥俗R符的匹配的條目。該條目包括與第一塊偏移值不同的第二塊偏移值。從塊容器檢索在第二塊偏移值處的數(shù)據(jù)塊。在其他方面,提供用于存儲數(shù)據(jù)流和對數(shù)據(jù)流進行碎片整理的實現(xiàn)。存儲對重復數(shù)據(jù)塊的最小可允許數(shù)的指示。累積來自數(shù)據(jù)流的數(shù)據(jù)塊的序列。如果所累積的數(shù)據(jù)塊序列是重復序列(例如,如果該數(shù)據(jù)塊序列匹配所存儲的數(shù)據(jù)塊序列),但其具有小于最小可允許數(shù)的長度,則將該數(shù)據(jù)塊序列作為新數(shù)據(jù)塊相鄰地存儲在塊容器中。此外,指向新數(shù)據(jù)塊的指針被存儲在數(shù)據(jù)流的流映射中。如果所累積的數(shù)據(jù)塊序列被確定為是重復序列且具有大于或等于最小可允許數(shù)的長度,則將指向之前存儲的數(shù)據(jù)塊序列的指針存儲在數(shù)據(jù)流的流映射中(而不是將該所累積的序列作為新數(shù)據(jù)塊來存儲)。此外,提供用于存儲數(shù)據(jù)流和對數(shù)據(jù)流進行碎片整理的各實現(xiàn)。存儲碎片因子。碎片因子指示所接收的數(shù)據(jù)流的指定部分所允許的最大碎片量。接收包括多個數(shù)據(jù)塊的數(shù)據(jù)流的一部分。確定多個數(shù)據(jù)塊中的多個數(shù)據(jù)塊序列。每一個所確定的數(shù)據(jù)塊序列包括相鄰存儲在塊容器中的、重復已存儲的數(shù)據(jù)塊序列的數(shù)據(jù)塊序列。將多個數(shù)據(jù)塊分段成與碎片因子相對應的數(shù)目的數(shù)據(jù)塊組。指向數(shù)據(jù)塊組的第一分組中的各數(shù)據(jù)塊的已存儲數(shù)據(jù)塊序列的指針被存儲。將多個數(shù)據(jù)塊中除數(shù)據(jù)塊組的第一分組中的那些數(shù)據(jù)塊以外的數(shù)據(jù)塊存儲在塊容器中。而且,提供了用于重組織已存儲數(shù)據(jù)流的實現(xiàn)。將各數(shù)據(jù)流作為(塊容器中的)數(shù)據(jù)塊以及作為包括指向相應的數(shù)據(jù)塊的指針的流映射來存儲??稍O定各數(shù)據(jù)流的優(yōu)先級。 對多個數(shù)據(jù)流中的已存儲數(shù)據(jù)塊的重組織是根據(jù)優(yōu)先順序來確定的。存儲多個數(shù)據(jù)流中的數(shù)據(jù)塊的第二塊容器是根據(jù)所確定的重組織來生成的。流映射中的各指針被修改成指向存儲在第二塊容器中的各數(shù)據(jù)塊。在重組織的一個實現(xiàn)中,數(shù)據(jù)流被選擇。通過轉移比所選數(shù)據(jù)流具有更低優(yōu)先級的數(shù)據(jù)流中的至少一個數(shù)據(jù)塊,由所選的數(shù)據(jù)流的流映射的指針所指向的一個或多個數(shù)據(jù)塊被重定位為比之前更相鄰。計算機程序產品在此還被描述為用于管理塊存儲、用于將數(shù)據(jù)塊以相鄰的方式存儲在塊存儲中、用于可靠地定位存儲中的數(shù)據(jù)塊、用于存儲數(shù)據(jù)流和/或管理數(shù)據(jù)流的碎片、用于重組織存儲中的已存儲數(shù)據(jù)流、以及用于此處所描述的其他實施例。下面將參考各個附圖,詳細描述本發(fā)明的進一步特點和優(yōu)點,以及本發(fā)明的各實施例的結構和操作。值得注意的是,本發(fā)明不僅限于此處所描述的特定實施例。本文呈現(xiàn)這些實施例僅用于說明性的用途?;诒疚乃拿枋?,其它實施例對于相關領域的技術人員將是顯而易見的。
結合到本說明書并構成本說明書的一部分的附圖示出了本發(fā)明,且與描述一起, 進一步用于說明本發(fā)明的原理,并允許那些精通相關的技術人員實施和使用本發(fā)明。圖1示出了根據(jù)一示例實施例的數(shù)據(jù)去重復系統(tǒng)的框圖。圖2示出根據(jù)一示例實施例的塊存儲的框圖。圖3和5示出了根據(jù)示例實施例的塊存儲的框圖。圖4示出根據(jù)一示例實施例的包括在流映射中的元數(shù)據(jù)的框圖。圖5示出根據(jù)一示例實施例的圖3的塊存儲,且還指示被流映射引用的一些數(shù)據(jù)塊。圖6示出了根據(jù)一示例實施例的數(shù)據(jù)流存儲系統(tǒng)的框圖。圖7示出了根據(jù)一示例實施例的用于存儲數(shù)據(jù)流的流程圖。圖8示出根據(jù)一示例實施例的元數(shù)據(jù)生成器的框圖。圖9示出了根據(jù)一示例實施例的用于分配位置指示符的流程圖。圖10根據(jù)一實施例示出圖解將數(shù)據(jù)流存儲在數(shù)據(jù)存儲中的示例的框圖。圖11根據(jù)一示例實施例示出包括再水合(rehydration)模塊的塊存儲接口的框圖。圖12示出根據(jù)一示例實施例的塊容器的框圖。圖13示出了根據(jù)一示例實施例的數(shù)據(jù)塊標識符的框圖。圖14示出根據(jù)一實施例的其中數(shù)據(jù)流被存儲在數(shù)據(jù)存儲中的圖10的示例,并且還圖解將數(shù)據(jù)塊從數(shù)據(jù)存儲中移除的效果。圖15示出根據(jù)一示例實施例的重定向表的框圖。圖16示出了根據(jù)一示例實施例的用于存儲數(shù)據(jù)流的流程圖。圖17示出了根據(jù)一示例實施例的數(shù)據(jù)塊重定向系統(tǒng)的框圖。圖18示出了根據(jù)一示例實施例的用于將數(shù)據(jù)塊定位到塊存儲中的流程圖。圖19示出根據(jù)一示例實施例的用以訪問塊存儲以再水合數(shù)據(jù)流的再水合模塊的框圖。圖20示出了根據(jù)一示例實施例的用于存儲數(shù)據(jù)流的流程圖。圖21示出根據(jù)一示例實施例的用于以優(yōu)化形式將數(shù)據(jù)流存儲在塊存儲中的數(shù)據(jù)流存儲系統(tǒng)的框圖。圖22示出了根據(jù)另一示例實施例的用于存儲數(shù)據(jù)流的流程圖。圖23示出根據(jù)一示例實施例的用于以優(yōu)化形式將數(shù)據(jù)流存儲在塊存儲中的數(shù)據(jù)流存儲系統(tǒng)的框圖。圖M-25示出根據(jù)示例實施例的用于重組織已存儲數(shù)據(jù)流的流程圖。圖沈示出根據(jù)一示例實施例的用于重組織存儲在塊存儲中的數(shù)據(jù)塊的存儲重組織系統(tǒng)的框圖。圖27示出了可用于實現(xiàn)本發(fā)明的各實施例的示例計算機的框圖。當結合其中相同的參考字符標識對應的元素的附圖時,本發(fā)明的特征和優(yōu)點將從以下闡述的詳細描述中變得更加顯而易見。在附圖中,相同的參考標號一般指相同的、功能上相似的和/或結構上相似的元素。其中元素第一次出現(xiàn)的附圖由對應的參考標號中最左側的數(shù)字指示。
具體實施例方式I.介紹本說明書公開了包括本發(fā)明的特征的一個或多個實施例。所公開的實施例只例示了本發(fā)明。本發(fā)明的范圍不僅限于所公開的實施例。本發(fā)明由所附的權利要求進行定義。說明書中對“一個實施例”、“實施例”、“示例實施例”等等的引用表示所描述的實施例可包括特定特征、結構或特性,但是,每一個實施例可以不一定包括該特定特征、結構, 或特征。此外,這些短語不一定指相同的實施例。此外,當參考一個實施例描述特定特征、 結構或特性時,假定在精通本技術的人員學識范圍內,可以與其他實施例一起實施這樣的特征、結構或特性,。在本說明書中,優(yōu)化數(shù)據(jù)指已被優(yōu)化的數(shù)據(jù)或者已由各數(shù)據(jù)去重復技術(諸如塊的單一實例化和壓縮等)中的一種或多種進行了去重復的數(shù)據(jù)。經優(yōu)化的流指被去重復后的流,或換言之,它們的數(shù)據(jù)已使用數(shù)據(jù)去重復技術來優(yōu)化。II.示例實施例實施例提供用于數(shù)據(jù)去重復的技術。這些實施例允許減少要被存儲或者要被傳輸?shù)臄?shù)據(jù)的量(例如,字節(jié)數(shù)),而不損害數(shù)據(jù)的保真性和完整性。例如,各實施例允許減少訪問優(yōu)化數(shù)據(jù)時的等待時間的量。而且,各實施例使諸如計算機器/設備等資源能夠被更高效地使用,從而降低了資源消耗。此外,各實施例提供用于數(shù)據(jù)去重復技術,這些技術能夠隨著所存儲的數(shù)字數(shù)據(jù)的量的增長而縮放。例如,在一實施例中,提供了用于數(shù)據(jù)去重復的可縮放塊存儲。這種塊存儲允許用于最小化優(yōu)化數(shù)據(jù)訪問中的等待時間的各種技術,并減少數(shù)據(jù)去重復、再水合和垃圾信息收集期間的機器資源消耗(例如,存儲器和盤I/O)。各示例實施例在以下子節(jié)中進一步詳細描述。A.示例性數(shù)據(jù)去重復實施例在各實施例中,可優(yōu)化要存儲的數(shù)據(jù),以減少數(shù)據(jù)所需的存儲的量。例如,數(shù)據(jù)流可以唯一數(shù)據(jù)塊的形式來存儲。數(shù)據(jù)塊可被定義數(shù)據(jù)流的映射引用。以這種方式中,數(shù)據(jù)流被更高效地存儲,因為多個映射可引用同一已存儲數(shù)據(jù)塊,而不是同一數(shù)據(jù)塊被存儲多次。 而且,可根據(jù)需要從存儲處請求優(yōu)化數(shù)據(jù)(例如,通過應用程序)。在這種情況下,可根據(jù)相應的映射從已存儲的數(shù)據(jù)塊重新組裝數(shù)據(jù)流。例如,圖1示出了根據(jù)一示例實施例的數(shù)據(jù)去重復系統(tǒng)100的框圖。如圖1中所示出地,系統(tǒng)100包括存儲系統(tǒng)102、數(shù)據(jù)去重復模塊104、維護模塊106和存儲108。而且, 存儲系統(tǒng)102包括數(shù)據(jù)流API (應用程序編程接口)110、塊維護API 112、和數(shù)據(jù)訪問API 114。描述系統(tǒng)100如下,以說明優(yōu)化數(shù)據(jù)的存儲以及優(yōu)化數(shù)據(jù)從存儲處的恢復,并且該系統(tǒng)并非旨在限制。系統(tǒng)100被配置成允許以高效的方式將數(shù)據(jù)存儲在存儲108中,以及允許從存儲 108檢索數(shù)據(jù)。例如,在一實施例中,可存在數(shù)據(jù)去重復模塊104。數(shù)據(jù)去重復模塊104被配置成優(yōu)化接收到的數(shù)據(jù)以供存儲。例如,數(shù)據(jù)去重復模塊104可壓縮作為數(shù)據(jù)流132來接收的接收到的數(shù)據(jù)。數(shù)據(jù)流132可包括數(shù)據(jù)文件的一部分、單個數(shù)據(jù)文件、多個數(shù)據(jù)文件、 和/或各文件和/或各文件部分的組合。如圖1所示出地,數(shù)據(jù)去重復模塊104生成數(shù)據(jù)塊124,數(shù)據(jù)塊IM可以是數(shù)據(jù)流132的已壓縮和已分段版本。數(shù)據(jù)流API 110提供允許存儲系統(tǒng)102接收數(shù)據(jù)塊124的接口。數(shù)據(jù)塊IM可包括形成數(shù)據(jù)流132的多個數(shù)據(jù)塊,數(shù)據(jù)塊IM從該數(shù)據(jù)流132生成。數(shù)據(jù)流API 110可以相關領域的技術人員所公知的任何合適方式來配置。數(shù)據(jù)流APIllO可輸出由塊存儲接口 116來接收的數(shù)據(jù)塊124。如圖1所示,存儲108耦合到存儲系統(tǒng)102。塊存儲接口 116是API 110、112和 114與存儲108之間的接口。例如,塊存儲接口 116可接收數(shù)據(jù)塊124,并可將數(shù)據(jù)塊124 中的數(shù)據(jù)塊存儲在存儲108中。例如,如圖1所示,存儲108包括塊存儲118。塊存儲接口 116可將數(shù)據(jù)塊124中的接收到的數(shù)據(jù)塊,如數(shù)據(jù)塊128,存儲在塊存儲118中。數(shù)據(jù)訪問API 114提供允許應用程序請求存儲系統(tǒng)102中的數(shù)據(jù)的接口。例如, 如圖1所示,數(shù)據(jù)訪問API 114可接收數(shù)據(jù)流請求120。數(shù)據(jù)訪問API 114可以相關領域的技術人員所公知的任何合適的方式來配置。數(shù)據(jù)訪問API 114可輸出由塊存儲接口 116來接收的數(shù)據(jù)塊120。塊存儲接口 116可從存儲108(例如,從塊存儲118)請求數(shù)據(jù)塊,這些數(shù)據(jù)塊與數(shù)據(jù)流請求120中所請求的數(shù)據(jù)流相對應。塊存儲接口 116可從存儲108處接收所請求的數(shù)據(jù)塊,如數(shù)據(jù)塊130,并可將包括數(shù)據(jù)塊130的數(shù)據(jù)流提供給數(shù)據(jù)訪問API 114。 數(shù)據(jù)訪問API 114可將數(shù)據(jù)流(例如,一個或重新組裝的文件)作為數(shù)據(jù)流響應122而提供給發(fā)出請求的應用程序。而且,可呈現(xiàn)維護模塊106來執(zhí)行與存儲在塊存儲118中的數(shù)據(jù)塊有關的一個或多個類型的維護工作。例如,維護模塊106可包括對存儲在存儲108中的數(shù)據(jù)塊執(zhí)行碎片整理的碎片整理模塊。例如,碎片整理模塊可被配置成消除存儲108中的空白空間(例如,執(zhí)行壓縮)、將相關的數(shù)據(jù)塊移入序列、和/或執(zhí)行其他相關任務。在另一示例中,維護模塊106可包括對存儲在存儲108中的數(shù)據(jù)塊執(zhí)行垃圾信息收集的信息收集模塊。例如, 垃圾信息收集模塊可被配置成刪除存儲108中的未被使用的數(shù)據(jù)塊。在其他實施例中,維護模塊106可對存儲108執(zhí)行附加的或另選的維護任務。如圖1中所示出地,塊維護API 112提供允許維護模塊106與存儲系統(tǒng)102進行交互的接口。維護模塊106可生成由塊維護API 112來接收的維護任務126(例如,碎片整理指令、壓縮指令、數(shù)據(jù)塊刪除指令等)。塊維護API 112可以相關領域的技術人員所公知的任何合適的方式來配置。塊維護API 112可將維護任務1 提供給塊存儲接口 116。塊存儲接口 116可允許對存儲在存儲108中的數(shù)據(jù)塊執(zhí)行維護任務126。存儲系統(tǒng)102可以任何合適的形式來實現(xiàn),包括一個或多個計算機/計算設備等形式。存儲108可包括一種或多種類型的存儲機制,包括磁盤(例如,以硬盤驅動器)、光盤(例如,以光盤驅動器)、磁帶(例如,以磁帶驅動器)、和/或任何其他合適類型的存儲介質。注意,數(shù)據(jù)去重復系統(tǒng)100是其中可實現(xiàn)本發(fā)明的各實施例的環(huán)境的示例。數(shù)據(jù)去重復系統(tǒng)100出于說明的目的而提供,并不旨在限制??蓪⒏鲗嵤├Y合在其他類型和配置的數(shù)據(jù)去重復系統(tǒng)中。B.允許數(shù)據(jù)塊定位的示例塊存儲實施例
圖1中的塊存儲118可以以任何方式存儲數(shù)據(jù)塊形式的數(shù)據(jù)流。例如,塊存儲118 可存儲指示包括在數(shù)據(jù)流中的數(shù)據(jù)塊的映射,并可存儲所引用的數(shù)據(jù)塊。在一實施例中,根據(jù)數(shù)據(jù)去重復技術,塊存儲118并不存儲數(shù)據(jù)塊的重復副本。例如,圖2示出根據(jù)一示例實施例的塊存儲118的框圖。如圖2中所示出地,塊存儲118包括流容器202和塊容器204。流容器202包括一個或多個流映射206,且塊容器 204包括多個數(shù)據(jù)塊208。數(shù)據(jù)塊208是被一個或多個數(shù)據(jù)流(例如,圖1中的數(shù)據(jù)流132) 引用的一段數(shù)據(jù)。流映射206是描述原始數(shù)據(jù)流結構與經優(yōu)化數(shù)據(jù)塊結構之間的映射的數(shù)據(jù)結構。流映射206直接包括或者通過間接層包括數(shù)據(jù)塊位置信息,從而使得可定位所引用的數(shù)據(jù)塊,并將其組裝成文件流視圖。數(shù)據(jù)塊208和流映射206分別被存儲在流容器202 和塊容器204中,其可以是文件系統(tǒng)中的文件。在一實施例中,塊存儲118以塊的形式存儲所有數(shù)據(jù),使得流映射206被存儲成包含內部元數(shù)據(jù)(數(shù)據(jù)流元數(shù)據(jù))的數(shù)據(jù)塊,內部元數(shù)據(jù)描述了文件流到數(shù)據(jù)塊208的映射、數(shù)據(jù)塊地址和散列。在各實施例中,可以以各種方式來配置流容器202和塊容器204。例如,圖3示出了根據(jù)示例實施例的塊存儲300的框圖。塊存儲300是圖2中的塊存儲118的一個示例。 如圖3中所示出地,塊存儲300包括存儲容器302和塊容器304。存儲容器302是圖2中的存儲容器202的一個示例,且塊容器304是圖2中的塊容器204的一個示例。在圖3的實施例中,存儲容器302包括文件頭部306、重定向表308、和多個流映射310。圖3中示出第一流映射310a和第二流映射310b以用于說明的目的,但在各實施例中,流容器302中可包括任何數(shù)目的流映射310,這包括成百的、成千的、和甚至更多數(shù)目的流映射310。塊容器304 包括文件頭部318、重定向表320、以及多個數(shù)據(jù)塊322。圖3中示出第一數(shù)據(jù)塊32 和第二數(shù)據(jù)塊322b以用于說明的目的,但在各實施例中,塊容器304中可包括任何數(shù)目的數(shù)據(jù)塊322,這包括成百的、成千的、和甚至更多數(shù)目的數(shù)據(jù)塊322。圖3的這些特征描述如下。在流容器302被作為文件來存儲的實施例中,文件頭部306是流容器302的文件頭部。文件頭部306可包括與流容器302相關聯(lián)的信息,該信息包括流容器標識符(例如, 流容器標識號)等。重定向表308可選地存在于流容器302中。當存在時,重定向表308可存儲關于流映射310中的任何一個在流容器302中的位置的改變的信息。例如,可將第一流映射310a 從流容器302刪除,并且可將第二流映射310b移動至第一流映射310a的位置(例如,由于碎片整理或壓縮例程)。在移動之后,可由應用程序來訪問流容器302,以檢索第二流映射 310b。然而,應用程序可能仍在使用第二流映射310b的之前位置。重定向表308可包括第二流映射310b的映射,該映射指示了第二流映射310b的當前位置。因此,應用程序可訪問重定向表308來確定第二流映射310b的當前位置,并且因此可被允許從該新位置檢索第二流映射310b。流映射310是圖2中的流映射206的示例。流映射310中的每一個用于定義構成特定數(shù)據(jù)流的數(shù)據(jù)塊322的序列。如圖3中所示出地,流映射310中的每一個包括流頭部312、元數(shù)據(jù)314和散列值316。例如,第一流映射310a被示為包括流頭部312a、元數(shù)據(jù) 31 、和散列值316a,且第二流映射310b被示為包括流頭部312b、元數(shù)據(jù)314b、和散列值 316b。每一個流頭部312都包括與相應的流映射310相關聯(lián)的信息,諸如流映射標識符(例如,流映射標識號)等。每一個元數(shù)據(jù)314都包括描述數(shù)據(jù)塊322的信息,數(shù)據(jù)塊322構成由相應的流映射310定義的數(shù)據(jù)流。散列值316可選地存在。散列值316是數(shù)據(jù)塊322的散列值,數(shù)據(jù)塊322構成由相應的流映射310定義的數(shù)據(jù)流。散列值316可被存儲在流映射310中,以便提供對構成相應數(shù)據(jù)流的數(shù)據(jù)塊的散列矢量的高效訪問。例如,這可能對有線數(shù)據(jù)傳送場景有用,在這些場景中期望對數(shù)據(jù)流散列的整個列表(所有經優(yōu)化文件塊的散列)的快速訪問。在元數(shù)據(jù)314中可包括各種類型的信息。例如,圖4示出了根據(jù)一示例實施例的元數(shù)據(jù)400的框圖。元數(shù)據(jù)400是圖3中的元數(shù)據(jù)314的示例。元數(shù)據(jù)400是被引用的每一個數(shù)據(jù)塊322的、可被包括在流映射310中的元數(shù)據(jù)(例如,每個塊的元數(shù)據(jù))的示例。 如圖4中所示出地,元數(shù)據(jù)400包括數(shù)據(jù)流偏移402、數(shù)據(jù)塊標識符404和位置指示符406。 數(shù)據(jù)流偏移402指示相關聯(lián)的數(shù)據(jù)塊322在由特定流映射310定義的數(shù)據(jù)流中的位置。例如,數(shù)據(jù)流偏移402可指示從數(shù)據(jù)流的開始處開始的字節(jié)數(shù),或者從數(shù)據(jù)流中相關聯(lián)的數(shù)據(jù)塊322所開始的其他引用點開始的字節(jié)數(shù)。數(shù)據(jù)塊標識符404(也稱為塊id或“可靠的塊定位符”)是指向塊容器304中的相應數(shù)據(jù)塊322的引用或指針。例如,特定數(shù)據(jù)塊的數(shù)據(jù)塊標識符404允許在塊容器304中可靠地定位數(shù)據(jù)塊。數(shù)據(jù)塊標識符404可具有各種形式,包括在以下更詳細描述的示例形式(例如,參考圖13)。位置指示符406是表示塊容器 304中的塊插入次序的信息,從而允許確定哪些數(shù)據(jù)塊322可被共同的流映射310引用。例如,位置指示符406允許將與相同的流映射310相關聯(lián)的各數(shù)據(jù)塊322相鄰地存儲在塊容器304中,或者在相鄰存儲不簡單時(例如,由于多個流映射310引用同一數(shù)據(jù)塊322)允許將各數(shù)據(jù)塊322相鄰地存儲在一起。位置指示符406還可被諸如塊散列索引等其他數(shù)據(jù)去重復組件用來改進散列查找和插入性能。參考圖3中的塊容器304,在塊容器304被存儲為文件的實施例中,文件頭部318 是塊容器304的文件頭部。文件頭部318可包括與塊容器304相關聯(lián)的信息,包括塊容器標識符(例如,塊容器標識號)、指示塊容器304的版本號的塊容器階段指示符等。重定向表320可選地存在于塊容器304。當存在時,重定向表320可以與流容器 302的重定向表308處理流映射310的位置中的改變相類似的方式來存儲關于數(shù)據(jù)塊322 中的任何一個的塊容器304中的位置中的改變的信息。數(shù)據(jù)塊322是圖2中的數(shù)據(jù)塊208的示例。如圖3中所示出地,數(shù)據(jù)塊322中的每一個包括塊頭部3M和塊數(shù)據(jù)326。例如,第一數(shù)據(jù)塊32 包括塊頭部32 和塊數(shù)據(jù) 326a,且第二數(shù)據(jù)塊322b包括塊頭部324b和塊數(shù)據(jù)326b。每一塊頭部312都包括與相應的數(shù)據(jù)塊322相關聯(lián)的信息,諸如數(shù)據(jù)塊標識符等。每一塊數(shù)據(jù)3 包括相應的數(shù)據(jù),該數(shù)據(jù)可以處于壓縮或非壓縮形式。流映射310和數(shù)據(jù)塊322分別被存儲在流容器302和塊容器304中,以允許數(shù)據(jù)去重復和數(shù)據(jù)去除-重復。例如,圖1中的塊存儲接口 116可接收與數(shù)據(jù)流132相關聯(lián)的數(shù)據(jù)塊124,并可將數(shù)據(jù)塊存儲在圖3中的塊存儲300中。例如,對于特定的數(shù)據(jù)流132,塊存儲接口 116可生成流映射,該流映射作為流映射310通過塊存儲接口 116存儲在流容器 302中,流映射310引用存儲在塊容器304中的一個或多個數(shù)據(jù)塊322。例如,圖5根據(jù)一示例實施例示出圖3中的塊存儲300,并指示被流映射310引用的一些數(shù)據(jù)塊322。如圖5中所示出地,第一流映射310a包括元數(shù)據(jù)314a,元數(shù)據(jù)31 包括對塊容器304中的第一數(shù)據(jù)塊32 和第二數(shù)據(jù)塊322b的引用。因此,第一數(shù)據(jù)塊32 和第二數(shù)據(jù)塊322b包括在與第一流映射310a相關聯(lián)的源數(shù)據(jù)流中。例如,元數(shù)據(jù)31 可包括指示第一數(shù)據(jù)塊32 在由第一流映射310a所定義的源數(shù)據(jù)流中的位置的第一數(shù)據(jù)塊 322a的數(shù)據(jù)流偏移402值、塊容器304中第一數(shù)據(jù)塊32 的數(shù)據(jù)塊標識符404(例如,第一數(shù)據(jù)塊32 存儲在塊頭部32 中的數(shù)據(jù)塊指示符)、以及第一數(shù)據(jù)塊32 的位置指示符406。而且,元數(shù)據(jù)31 可包括指示第二數(shù)據(jù)塊322b在該源數(shù)據(jù)流中的位置的第二數(shù)據(jù)塊322b的數(shù)據(jù)流偏移402值、塊容器304中第二數(shù)據(jù)塊322b的數(shù)據(jù)塊標識符404(例如, 第二數(shù)據(jù)塊322b存儲在塊頭部324b中的數(shù)據(jù)塊指示符)、以及第二數(shù)據(jù)塊322b的位置指示符406。在一實施例中,第一數(shù)據(jù)塊32 和第二數(shù)據(jù)塊322b可具有相同值的位置指示符,該相同值被生成來與由第一流映射310a所定義的源數(shù)據(jù)流相對應,并且該相同值指示第一數(shù)據(jù)塊32 和第二數(shù)據(jù)塊322b被相鄰地(相鄰地)存儲在塊容器304中。此外,第二流映射310b包括元數(shù)據(jù)314b,元數(shù)據(jù)314b包括對塊容器304中的第二數(shù)據(jù)塊322b的引用。例如,元數(shù)據(jù)314b可包括指示第二數(shù)據(jù)塊322b在由第二流映射310b 所定義的源數(shù)據(jù)流中的位置的第二數(shù)據(jù)塊322b的數(shù)據(jù)流偏移402值、塊容器304中第二數(shù)據(jù)塊322b的數(shù)據(jù)塊標識符404(例如,第二數(shù)據(jù)塊322b存儲在塊頭部324b中的數(shù)據(jù)塊指示符)、以及第二數(shù)據(jù)塊32 的位置指示符406。元數(shù)據(jù)314b中第二數(shù)據(jù)塊32 的位置指示符406具有與為第一數(shù)據(jù)塊32 和第二數(shù)據(jù)塊322b生成的位置指示符相同的值,因為第二數(shù)據(jù)塊322b最初被存儲在第一流映射310a的塊容器304中。向在由第二流映射 3IOb定義的源數(shù)據(jù)流被存儲在塊存儲300中時新近存儲在塊容器304中的任何其他數(shù)據(jù)塊 322(圖5中未示出)分配位置指示符406的新值。圖1中的塊存儲接口 116可以將數(shù)據(jù)流存儲在圖3的塊存儲300中的各種方式來配置。例如,圖6示出了根據(jù)一示例實施例的數(shù)據(jù)流存儲系統(tǒng)600的框圖。如圖6中所示出地,數(shù)據(jù)流存儲系統(tǒng)600包括數(shù)據(jù)流解析器602、塊存儲接口 116、流容器302、以及塊容器 304。在一實施例中,可將數(shù)據(jù)流解析器602包括在圖1的數(shù)據(jù)去重復模塊104中。在圖6 的實施例中,塊存儲接口 116包括數(shù)據(jù)塊存儲管理器604、元數(shù)據(jù)生成器606和流映射生成器608。參考圖7描述圖6中的這些特征如下。圖7示出了根據(jù)一示例實施例的用于存儲數(shù)據(jù)流的流程圖700。在一實施例中,圖6中的系統(tǒng)600可根據(jù)流程圖700來操作?;谟嘘P流程圖700的討論,進一步的結構及操作的實施例對于相關領域的技術人員將是顯而易見的。流程圖700和系統(tǒng)600描述如下。流程圖700開始于步驟702。在步驟702處,將數(shù)據(jù)流解析成數(shù)據(jù)塊。例如,如圖 6中所示出地,數(shù)據(jù)流解析器602可接收數(shù)據(jù)流610。類似于圖1中的數(shù)據(jù)流132,數(shù)據(jù)流 610可包括一個或多個文件和/或文件的各部分,數(shù)據(jù)流解析器602被配置來將數(shù)據(jù)流610 解析成被指示為數(shù)據(jù)塊序列612的數(shù)據(jù)塊的序列。例如,在一實施例中,數(shù)據(jù)塊序列612可以以將數(shù)據(jù)塊定位在數(shù)據(jù)流610中的次序來包括數(shù)據(jù)塊序列。數(shù)據(jù)塊序列612中的數(shù)據(jù)塊可具有相同的大小或可具有不同的大小。在步驟704處,確定這些數(shù)據(jù)塊中的任何一個是否是存儲在塊容器中的數(shù)據(jù)塊的重復。例如,如圖6中所示出地,數(shù)據(jù)塊存儲管理器604接收數(shù)據(jù)塊序列612。數(shù)據(jù)塊存儲管理器604被配置成確定數(shù)據(jù)塊序列612中的數(shù)據(jù)塊中的任何一個是否已經被存儲在塊容器304中并因此是重復的。例如,在一實施例中,如圖6中所示出地,數(shù)據(jù)塊存儲管理器604 可從塊容器304接收數(shù)據(jù)塊信息626,數(shù)據(jù)塊信息6 可包括存儲在塊容器304中的每一數(shù)CN 102541751 A
據(jù)塊322的散列值。在另一實施例中,數(shù)據(jù)塊存儲管理器604可從流容器302接收散列值 316 (圖幻,散列值316是存儲在塊容器304中的數(shù)據(jù)塊322的散列值。數(shù)據(jù)塊存儲管理器 604可為數(shù)據(jù)塊序列612中的每一數(shù)據(jù)塊生成散列值,并可將所生成的散列值與數(shù)據(jù)塊信息626中(或者從流容器302處)接收的散列值進行比較,以確定數(shù)據(jù)塊序列612中的各數(shù)據(jù)塊是否已經被存儲在塊容器304中。在其他實施例中,數(shù)據(jù)塊存儲管理器604可確定數(shù)據(jù)塊序列612中的哪些數(shù)據(jù)塊已以相關領域的技術人員所公知的其他方式存儲在塊容器304中。如圖6中所示出地,數(shù)據(jù)塊存儲管理器604生成已存儲塊指示616,該已存儲塊指示616指示了數(shù)據(jù)塊序列612中的哪些數(shù)據(jù)塊已被存儲在塊容器304中。再參考圖7,在步驟706處,將被確定為不是重復的各數(shù)據(jù)塊以相鄰的排列并以與數(shù)據(jù)流中的順序相同的順序存儲在塊容器中。例如,在一實施例中,數(shù)據(jù)塊存儲管理器604 可被配制成將數(shù)據(jù)塊序列612中沒有被確定為已存儲的各數(shù)據(jù)塊存儲在塊容器304中。例如,在一實施例中,數(shù)據(jù)塊存儲管理器604可為每一新數(shù)據(jù)塊生成塊頭部3 (例如,數(shù)據(jù)塊標識符),并將每一新數(shù)據(jù)塊當作具有塊頭部3M和塊數(shù)據(jù)3 的數(shù)據(jù)塊322來存儲。此外, 在一實施例中,數(shù)據(jù)塊存儲管理器604被配置成將各新數(shù)據(jù)塊以相鄰的排列并以與源數(shù)據(jù)流中的順序相同的順序(例如,以在數(shù)據(jù)塊序列612中接收的次序)存儲在塊容器304中。在步驟708處,生成被確定為不是重復的各數(shù)據(jù)塊中的每一個的元數(shù)據(jù),數(shù)據(jù)塊的元數(shù)據(jù)包括數(shù)據(jù)流偏移、指向在塊容器中的位置的指針、以及位置指示符。例如,如圖6 中所示出地,元數(shù)據(jù)生成器606可接收數(shù)據(jù)塊序列612和已存儲塊指示616。在一實施例中,元數(shù)據(jù)生成器606可被配置成生成元數(shù)據(jù)(例如,圖3中的元數(shù)據(jù)314)。元數(shù)據(jù)生成器 606可為數(shù)據(jù)塊序列612中的每一數(shù)據(jù)塊生成元數(shù)據(jù),該元數(shù)據(jù)包括數(shù)據(jù)流偏移402、數(shù)據(jù)塊標識符404、和位置指示符406。對于被確定為已存儲在塊容器304中的各數(shù)據(jù)塊(在步驟704中),數(shù)據(jù)塊標識符404被配置成指向已存儲數(shù)據(jù)塊。對于在步驟708中新存儲在塊容器304中的各數(shù)據(jù)塊,數(shù)據(jù)塊標識符404被配制成指向行存儲的數(shù)據(jù)塊。 在各實施例中,元數(shù)據(jù)生成器606可以以各種方式被配置來生成元數(shù)據(jù)。例如,圖 8示出了根據(jù)一示例實施例的元數(shù)據(jù)生成器606的框圖。如圖8中所示出地,元數(shù)據(jù)生成器 606包括元數(shù)據(jù)收集器802和位置指示符生成器804。如圖8中所示出地,位置指示符生成器804接收數(shù)據(jù)塊序列612和已存儲塊指示616。位置指示符生成器804被配置成為數(shù)據(jù)塊序列612中沒有被已存儲塊指示616指示為已存儲在塊容器304中的每一數(shù)據(jù)塊生成位置指示符406。如圖8中所示出地,位置指示符生成器804生成一個或多個位置指示符值 622,該值指示數(shù)據(jù)塊序列612中每一數(shù)據(jù)塊的位置指示符406。 元數(shù)據(jù)收集器802接收位置指示符值622、數(shù)據(jù)塊序列612和已存儲塊指示616。 元數(shù)據(jù)收集器802收集數(shù)據(jù)塊序列612中每一數(shù)據(jù)塊的元數(shù)據(jù)。例如,元數(shù)據(jù)收集器802 可確定在數(shù)據(jù)塊序列612中接收的每一數(shù)據(jù)塊的數(shù)據(jù)流偏移402。例如,元數(shù)據(jù)收集器802 可基于在數(shù)據(jù)塊序列612中接收各數(shù)據(jù)塊的次序和/或接收到的數(shù)據(jù)塊的長度來確定每一數(shù)據(jù)塊的數(shù)據(jù)流偏移402 (例如,一數(shù)據(jù)塊的數(shù)據(jù)流偏移402可被設定為數(shù)據(jù)塊序列612中在該數(shù)據(jù)塊之前被接收到的各數(shù)據(jù)塊的長度的和,或者以其他方式來設定)。元數(shù)據(jù)收集器 802可為每一數(shù)據(jù)塊生成數(shù)據(jù)塊標識符404,以標識塊容器304中的每一數(shù)據(jù)塊。元數(shù)據(jù)收集器802向每一數(shù)據(jù)塊分配在位置指示符值622中接收到的相應位置指示符值。元數(shù)據(jù)收集器802將與在數(shù)據(jù)塊序列612中接收到的每一數(shù)據(jù)塊相關聯(lián)的元數(shù)據(jù)作為數(shù)據(jù)塊元數(shù)據(jù) 620輸出。在一實施例中,元數(shù)據(jù)生成器606可根據(jù)圖9來分配各位置指示符值622。圖9示出了根據(jù)一示例實施例的用于分配位置指示符的流程圖900。流程圖900開始于步驟902。 在步驟902,選擇與數(shù)據(jù)流相關聯(lián)的新位置指示符值。例如,當接收數(shù)據(jù)流的數(shù)據(jù)塊序列 612時,位置指示符生成器804可選擇新位置指示符值來與該數(shù)據(jù)流相關聯(lián)。該新位置指示符值是唯一的,且與正用于之前接收的數(shù)據(jù)流的位置指示符值不同,這些之前接收的數(shù)據(jù)流已經具有存儲在塊容器304中的數(shù)據(jù)塊。例如,新位置指示符值可以是所生成的與數(shù)據(jù)流相關聯(lián)的唯一數(shù)字。位置指示符生成器804將所選位置指示符值作為所選位置指示符值 622來輸出。在步驟904中,將新位置指示符值分配給在步驟704中被確定為不是重復的各數(shù)據(jù)塊中的每一個的位置指示符。例如,如圖8中所示出的,所選位置指示符值622是由元數(shù)據(jù)收集器802來接收的。元數(shù)據(jù)收集器802被配置成將所選位置指示符值622作為位置指示符406分配給數(shù)據(jù)塊序列612中被已存儲塊指示616指示為尚未存儲在塊容器304中的第一組數(shù)據(jù)塊(即,各新數(shù)據(jù)塊)中的每一數(shù)據(jù)塊。在步驟906中,對于在步驟704中被確定為是重復的每一個數(shù)據(jù)塊,將與已存儲在塊容器中的匹配數(shù)據(jù)塊相關聯(lián)的位置指示符值分配給位置指示符。例如,已存儲在塊容器 304中的每一數(shù)據(jù)塊322(重復數(shù)據(jù)塊)具有已分配的位置指示符406,因為位置指示符值是在數(shù)據(jù)塊322最初被存儲在塊容器304中的時候被分配給數(shù)據(jù)塊322的。在一實施例中, 對于被已存儲塊指示616指示為已存儲在塊容器中的各數(shù)據(jù)塊,元數(shù)據(jù)收集器802將與已存儲在塊容器304中的數(shù)據(jù)塊相關聯(lián)的位置指示符值分配給在數(shù)據(jù)塊序列612中接收到的匹配/重復數(shù)據(jù)塊。因此,數(shù)據(jù)塊序列612中的一組或多組數(shù)據(jù)塊各自可被分配與存儲在塊容器304中的相應數(shù)據(jù)塊相關聯(lián)的相應位置指示符值。再參考圖7,在步驟710中,生成包括所生成的元數(shù)據(jù)的數(shù)據(jù)流的流映射。例如,如圖6中所示出的,流映射生成器608接收在特定數(shù)據(jù)流的數(shù)據(jù)塊序列612中接收到的每一數(shù)據(jù)塊的數(shù)據(jù)塊元數(shù)據(jù)620。流映射生成器608生成與包括每一所接收的數(shù)據(jù)塊的數(shù)據(jù)塊元數(shù)據(jù)620的數(shù)據(jù)流相關聯(lián)的流映射624。此外,流映射生成器608可生成流映射擬4的流頭部312,并可將所接收每一數(shù)據(jù)塊的散列值316包括在流映射624中。在步驟712中,將該流映射存儲在流容器中。例如,如圖6中所示出地,流映射生成器608可將流映射624(例如,作為流映射310)存儲(或“持久存儲”)在流容器302中。圖10根據(jù)一實施例示出圖解將數(shù)據(jù)流存儲在數(shù)據(jù)存儲中的示例的框圖。提供圖10以用作說明的目,而不旨在限制。在圖10的示例中,將第一數(shù)據(jù)流100 存儲在數(shù)據(jù)存儲中,接著將第二數(shù)據(jù)流1002b存儲在數(shù)據(jù)存儲中。示出第一數(shù)據(jù)流1002a的流鏈接 1008a(也稱為“流指針”或“流存根(stub)”),并示出第二數(shù)據(jù)流1002b的流鏈接1008b。 如圖10中所示出地,第一數(shù)據(jù)流100 包括四個數(shù)據(jù)塊1014a-1014d。如上所述,可為第一數(shù)據(jù)流100 生成流映射1004a,并可將四個數(shù)據(jù)塊10Ha-1014d存儲在塊容器1006中。流映射100 包括指向數(shù)據(jù)塊1014a-1014d中的每一個的指針(由圖10中的箭頭表示)。可將數(shù)據(jù)塊10Ha-1014d分類在對塊容器1006而言是新的、唯一的所有數(shù)據(jù)塊的單個組中。 這樣,可將數(shù)據(jù)塊1014a-1014d以相鄰的排列并以與數(shù)據(jù)流1002a中的次序相同的次序存
13儲在塊容器1006中。例如,數(shù)據(jù)塊10Ha-1014d可以是存儲在塊容器1006中的前四個數(shù)據(jù)塊,或者如果一個或多個數(shù)據(jù)塊已被存儲在塊容器1006中,則可將數(shù)據(jù)塊10Ha-1014d 存儲在塊容器1006中緊接著這些已存儲數(shù)據(jù)塊的位置。向數(shù)據(jù)塊1014a-1014d中的每一個分配流映射1004a中的相同位置指示符值、為第一數(shù)據(jù)流100 選擇的位置指示符值。第二數(shù)據(jù)流1002b包括四個數(shù)據(jù)塊1014b、1014c、10He和1014f。可為第二數(shù)據(jù)流 1002b生成流映射1004b。根據(jù)流程圖700中的步驟704,可將數(shù)據(jù)塊1014b、1014c、IOHe和 1014f分類成兩組數(shù)據(jù)塊包括塊1014b和IOHc的第一組,(由于第一數(shù)據(jù)流100 的塊序列)塊1014b和1014c已經具有駐留在塊容器1006中的副本;以及,包括塊IOHe和1014f 的第二組,塊IOHe和1014f是新的、唯一的數(shù)據(jù)塊(其不具有已經存儲在塊容器1006中的副本)。由于數(shù)據(jù)塊1014b和1014c已經被存儲在塊容器1006中,因此流映射1004b包括指向已經存儲在塊容器1006中的數(shù)據(jù)塊1014b和1014c的指針(數(shù)據(jù)塊標識符404的值)。因此,可將數(shù)據(jù)塊1014b和IOHc作為指向塊容器1006中的現(xiàn)有數(shù)據(jù)塊的指針來存儲,而無需存儲數(shù)據(jù)塊1014b和1014c的塊數(shù)據(jù)。如上所述,由于數(shù)據(jù)塊IOHe和1014f尚未存儲在塊容器1006中,因此可將數(shù)據(jù)塊IOHe和1014f存儲在塊容器1006中。例如,由于數(shù)據(jù)塊IOHe和1014f對塊容器1006而言是新的、唯一的數(shù)據(jù)塊,因此可將塊IOHe和 1014f以相鄰的排列并以與數(shù)據(jù)流1002b中的次序相同的次序存儲在塊容器1006中在當前存儲在塊容器1006中的最后一個已存儲數(shù)據(jù)塊(例如,數(shù)據(jù)塊1014d)之后。流映射1004b 包括前四個數(shù)據(jù)塊標識符1012a-1012d,這些標識符分別指向存儲在塊容器1006中的數(shù)據(jù)塊1014b、1014c、IOHe和1014f。在流映射1004b中,向數(shù)據(jù)塊1014b和IOHc分配與第一數(shù)據(jù)流100 相關聯(lián)的位置指示符值(根據(jù)圖9中的步驟906),且向數(shù)據(jù)塊IOHe和1014f 分配為第二數(shù)據(jù)流1002b選擇的位置指示符值(例如,根據(jù)圖9中的步驟902和904)。注意,任何數(shù)目的附加數(shù)據(jù)流1002可以以與數(shù)據(jù)流100 和1002b類似的方式來進行存儲。此外,注意,在圖10的示例中,第二流映射1004b中的數(shù)據(jù)塊各自被分配如下兩個位置指示符值中的一個——為第二流映射1004b選擇的新位置指示符值,或者與第一流映射1004a的數(shù)據(jù)塊相關聯(lián)的位置指示符值。在各實施例中,特定流映射的數(shù)據(jù)塊可被分配任何數(shù)目的位置指示符值中的一個,這取決于與塊容器中已存在的流映射的數(shù)據(jù)塊相關聯(lián)的不同位置指示符的數(shù)目。例如,如所描述地,可向對塊容器而言為新的數(shù)據(jù)塊分配為與流映射相關聯(lián)的特定數(shù)據(jù)流所選擇的新位置指示符值。此外,向被已經存在于塊容器中的流映射所引用的任何數(shù)目的數(shù)據(jù)塊分配已經存在于該塊容器中的數(shù)據(jù)塊的相應位置指示符值。這可意味著可向數(shù)據(jù)流中任何數(shù)目的一組或多組數(shù)據(jù)塊分配相應的位置指示符值, 使得可向該數(shù)據(jù)流中的各數(shù)據(jù)塊分配從兩個、三個或甚至更多個不同的位置指示符值中選擇的位置指示符。因此,流映射元數(shù)據(jù)中的位置指示符允許各數(shù)據(jù)塊在數(shù)據(jù)流中的位置是確定的。 這是因為重復的數(shù)據(jù)塊趨向于成組的出現(xiàn)。在新數(shù)據(jù)流包含已知數(shù)據(jù)塊(已經存儲在塊容器中)時,存在以下合理的可能性在該新數(shù)據(jù)流中下一數(shù)據(jù)塊也是重復的數(shù)據(jù)塊(已經存儲在塊容器中)。由于各新的、原始數(shù)據(jù)被塊被根據(jù)位置指示符彼此相鄰地存儲在塊容器中,因此新數(shù)據(jù)流所引用的各已存在數(shù)據(jù)塊更可能也被相鄰地存儲在塊容器中。這有助于改進從塊存儲讀取經優(yōu)化的數(shù)據(jù)流的性能。例如,被配置成基于相應的流映射和數(shù)據(jù)塊來重新組裝數(shù)據(jù)流的再水合模塊可對存儲在塊容器中的各數(shù)據(jù)塊執(zhí)行預讀(read-ahead),以期望找到在前讀緩存器中需要的下一數(shù)據(jù)塊。此外,如碎片整理和壓縮等塊存儲維護任務可執(zhí)行它們的任務,同時通過在現(xiàn)有的相鄰塊在塊容器中四處移動時將這些相鄰塊維持在一起來嘗試維護原始位置。例如,在數(shù)據(jù)流被優(yōu)化并且這些數(shù)據(jù)流以流映射310和數(shù)據(jù)塊322的形式被存儲在塊存儲300之后,可從塊存儲300處讀取這些數(shù)據(jù)流。圖11根據(jù)一示例實施例示出包括再水合(rehydration)模塊1102的塊存儲接口 116的框圖。再水合模塊1102被配置成重新組裝所請求的數(shù)據(jù)流(例如,根據(jù)圖1中示出的數(shù)據(jù)流請求120來請求的數(shù)據(jù)流)。例如, 對于要響應于數(shù)據(jù)流請求120(圖1)從塊存儲300處讀取的數(shù)據(jù)流,再水合模塊1102確定并接收被來自塊存儲300的數(shù)據(jù)流請求120的經優(yōu)化文件引用(例如,在重解析位置)的流映射310。例如,再水合模塊1102可將請求120的流映射標識符提供給圖3中的塊存儲 300。塊存儲200基于流標識符(例如,通過掃描流映射頭部312)接收相應的流映射310, 并且再水合模塊1102可根據(jù)檢索到的流映射310重新生成或“再水合”數(shù)據(jù)流。檢索到的流映射310包括指向塊容器304中包括在數(shù)據(jù)流中的數(shù)據(jù)塊中的每一個的指針(圖4中的數(shù)據(jù)塊標識符404)。再水合模塊1102使用這些指針來檢索這些數(shù)據(jù)塊322中的每一個。 再水合模塊1102可使用包括在檢索到的流映射310中的數(shù)據(jù)流偏移402(例如,外加可被包括在檢索到的流映射310中的數(shù)據(jù)塊長度信息)將檢索到的數(shù)據(jù)塊322以重新生成由再水合模塊1102輸出的數(shù)據(jù)流的合適次序排列成數(shù)據(jù)流1104。通過對位置指示符406的使用,可執(zhí)行從塊容器304中對數(shù)據(jù)塊322的順序讀取。 例如,在文件流正被再水合模塊1102使用串行I/O (輸出/輸出)請求或包括一個以上數(shù)據(jù)塊邊界的任何I/O請求在塊存儲300中訪問時,流映射310允許對數(shù)據(jù)庫的快速訪問。這是因為在塊存儲300創(chuàng)建流映射310的時候,將各新數(shù)據(jù)塊以流映射次序相鄰地存儲在塊容器304中。因此,在由再水合模塊1102的順序數(shù)據(jù)訪問期間,屬于同一數(shù)據(jù)流的各數(shù)據(jù)塊可能會被相鄰地存儲,這些相鄰數(shù)據(jù)塊可用單個數(shù)據(jù)訪問“查找”(例如,向前或向后經過塊容器以便找到要讀取的下一個已存儲數(shù)據(jù)塊的移動)來訪問和讀取,并且碎片可被減少成非唯一數(shù)據(jù)塊(被流映射引用的、在存儲相應的數(shù)據(jù)流之前已經存在于塊容器中的數(shù)據(jù)塊)。順序數(shù)據(jù)訪問期間的數(shù)據(jù)訪問查找限于針對在數(shù)據(jù)塊或數(shù)據(jù)流中的一系列塊被發(fā)現(xiàn)已經存儲于塊存儲中時的情況。流映射310提供了用于可能被數(shù)據(jù)去重復系統(tǒng)中的其他模塊(例如,被文件復制模塊使用的散列值的列表)需要的經優(yōu)化文件元數(shù)據(jù)(例如,元數(shù)據(jù) 314)的高效元數(shù)據(jù)容器。流映射310是簡明的,并且可被高速緩存在存儲器中以便快速訪問。塊存儲300可基于LRU(至少目前使用的)算法或其他類型的高速緩存算法來高速緩存(被再水合模塊1102頻繁請求和再水合的經優(yōu)化數(shù)據(jù)流的)被頻繁訪問的流映射310。C.允許可靠的定位數(shù)據(jù)塊的示例性塊存儲的實施例如上所述地,可出于各種原因(諸如由于碎片整理技術、由于執(zhí)行垃圾信息收集的壓縮技術等)在塊容器中移動數(shù)據(jù)塊。本小節(jié)中描述了用于保持對各數(shù)據(jù)塊在塊容器中的移動的跟蹤的各實施例。圖12示出根據(jù)一示例實施例的塊容器304的框圖。如圖12中所示出地,塊容器 304大致類似于圖3中的塊容器304,但在文件頭部318中還包括塊容器標識符1202和塊容器階段指示1204。塊容器標識符1202是分配給塊容器304的唯一標識符(例如,標識號),用于將塊容器304與可能存在于塊存儲300中的其他塊容器區(qū)分開。塊容器階段指示1204指示塊容器304的版本或階段。例如,每當在塊容器304中移動一個或多個數(shù)據(jù)塊 322時,可修改階段指示1204(例如,可將其從諸如0或其他開始值等開始階段級別增加到下一階段級別)。在一實施例中,塊容器304可由塊容器標識符1202和塊容器階段指示1204的組合(例如,可形成塊容器304的文件名)來標識。在一實施例中,塊容器標識符1202和塊容器階段指示1204兩者都可以是整數(shù)。塊容器304可具有固定的大小(即,固定數(shù)目的條目),或者可具有可變的大小。例如,在一示例實施例中,可將定義塊容器304的每一塊容器文件的大小設為可存儲大約16000個塊,并且平均數(shù)據(jù)塊大小為64KB,其中塊容器文件的大小被設為1GB。在另一實施例中,塊容器文件可具有可另選的大小??筛鶕?jù)元數(shù)據(jù)400 (圖4)的數(shù)據(jù)塊標識符404以各種方式引用存儲在塊容器304 中的數(shù)據(jù)塊322。例如,圖13示出了根據(jù)一示例實施例的數(shù)據(jù)塊標識符1300的框圖。在各實施例中,流映射310可將數(shù)據(jù)塊標識符1300作為數(shù)據(jù)塊標識符404存儲在元數(shù)據(jù)314中。 如圖13中所示出地,數(shù)據(jù)塊標識符1300包括數(shù)據(jù)塊容器標識符1302、局部標識符1304、塊容器階段值1306和塊偏移值1306。塊容器標識符1302具有其中存儲有數(shù)據(jù)塊322的塊容器304的塊容器標識符1202的值。局部標識符1304是分配給數(shù)據(jù)塊322的標識符(例如,數(shù)字值),該標識符對于存儲有數(shù)據(jù)塊322的塊容器304中的被分配數(shù)據(jù)塊322是唯一的(例如,是數(shù)據(jù)塊的唯一的、每個容器的標識符)。塊容器階段值1306具有其中存儲有數(shù)據(jù)塊322的塊容器304在數(shù)據(jù)塊322被存儲在塊容器304中的時候的塊容器階段指示1204 的值。注意,分配給數(shù)據(jù)塊322的局部標識符1304的值在塊容器304的整個歷史中(例如, 在所有階段中)對于數(shù)據(jù)塊322是唯一的,并且該值是不可變的。塊偏移值1306是塊容器 304中的數(shù)據(jù)塊322在數(shù)據(jù)塊322被添加到塊容器304中的時候的偏移。因此,根據(jù)圖13中的實施例,數(shù)據(jù)塊322可由流映射310通過數(shù)據(jù)塊標識符1300 來引用,數(shù)據(jù)塊標識符1200包括塊偏移值1306,該塊偏移值指示塊容器304中的數(shù)據(jù)塊 322在它們被存儲時的偏移。然而,如果隨后在塊容器304中移動數(shù)據(jù)塊322(即,塊容器 304中的數(shù)據(jù)塊322的偏移改變了),則在流映射310中使用的數(shù)據(jù)塊322的現(xiàn)有數(shù)據(jù)塊標識符1300可具有針對塊偏移值1306的不正確的值。這個概念在圖14中示出。圖14示出根據(jù)一實施例的其中數(shù)據(jù)流被存儲在數(shù)據(jù)存儲中的圖10的示例,并且還圖解了將數(shù)據(jù)塊從數(shù)據(jù)存儲中移除的效果。如圖14中所示出地,類似于圖10,第二數(shù)據(jù)流1002b具有相應的流映射1004b (例如,存儲在流容器302中, 圖14中未示出),并具有存儲在塊容器1006中的數(shù)據(jù)塊1014b、1014c、IOHe和1014f。然而,與圖10相反,已將第一數(shù)據(jù)流100 從塊存儲處移除。因此,第一流映射100 不再存在。此外,將本示例中僅被流映射1004a引用的數(shù)據(jù)塊101 和1014b從塊容器1006處移除(例如,通過垃圾信息收集技術)。而且,由于數(shù)據(jù)塊101 和1014d不再存在于塊容器1006中,從而留下了未使用空間/存儲間隙,因此壓縮算法已將1014b、10Hc、10He和 1014f在塊容器1006中進行移動,以收回未使用空間。如圖14中所示出地,數(shù)據(jù)塊1014b 已被轉移至塊容器1006中的第一偏移位置(數(shù)據(jù)塊101 之前所在的位置),數(shù)據(jù)塊IOHc 已被轉移至鄰接著數(shù)據(jù)塊1014b的另一偏移位置,數(shù)據(jù)塊1014e已被轉移至鄰接著數(shù)據(jù)塊 1014c的另一偏移位置,并且數(shù)據(jù)塊1014f已被轉移至鄰接著數(shù)據(jù)塊1014e的另一偏移位置。通過這種方式,可將塊容器304中之前由數(shù)據(jù)塊101 和1014d填充的存儲空間收回。
然而,由于數(shù)據(jù)塊1014b、1014c、10He和1014f已在塊容器1006中移動過了, 因此流映射1004b中的數(shù)據(jù)塊標識符1012a-1012d不再指向數(shù)據(jù)塊1014b、1014c、1014e 和1014f (例如,表示指針1012a-1012d的箭頭被示為指向數(shù)據(jù)塊1014b、1014c、IOHe和 1014f的之前位置)。如果在再水合數(shù)據(jù)流1002b的嘗試中使用流映射1004b,則該嘗試將失敗,因為數(shù)據(jù)塊1014b、1014c、IOHe和1014f在它們之前的位置是不可獲取的。因此,期望具有用于將數(shù)據(jù)塊1014b、1014c、IOHe和1014f定位到它們的新偏移處的技術。在一實施例中,塊存儲可實現(xiàn)可靠的塊定位器,該塊定位器可用于跟蹤已移動的數(shù)據(jù)塊。與傳統(tǒng)技術相反,該可靠的塊定位器并不使用用于將數(shù)據(jù)塊標識符映射到物理塊位置的索引。傳統(tǒng)技術使用將塊標識符映射到塊數(shù)據(jù)物理位置的索引。存儲系統(tǒng)的規(guī)模 (例如,兆兆字節(jié)(TB)的100倍或更大)以及平均塊大小(例如,64KB)使得這一索引非常大。如果將這一索引全部加載到存儲器中,則它將消耗大量的可用存儲器和處理器資源。如果不將該索引加載到存儲器中,則數(shù)據(jù)訪問將變得很慢,因為需要將該索引分頁存儲到存儲器中。此處描述的各實施例并不使用這一索引,因此保留了系統(tǒng)資源。在一實施例中,可靠的塊定位器是以重定向表的形式來實現(xiàn)的,諸如圖3中的塊容器304的重定向表320。重定向表可存儲在塊容器304中已移動過的數(shù)據(jù)塊322的一個或多個條目。每一條目標識已移動的數(shù)據(jù)塊322并具有數(shù)據(jù)塊偏移值,該數(shù)據(jù)塊偏移值將數(shù)據(jù)塊322在塊容器304中的位置指示到它的新位置處。在數(shù)據(jù)流的再水合期間可參考重定向表,以定位數(shù)據(jù)流中已移動過的任何數(shù)據(jù)塊。例如,圖15示出了根據(jù)示例實施例的重定向表1500的框圖。如果在塊容器304 中移動了數(shù)據(jù)塊322,則使用重定向表1500來定位數(shù)據(jù)塊322(包括作為數(shù)據(jù)塊來存儲的流映射)。例如,重定向表1500允許為了作為垃圾信息收集和壓縮過程的一部分的空間收回而在塊容器304中移動數(shù)據(jù)塊,并且該重定向表1500仍可基于數(shù)據(jù)塊322的原始塊標識符來進行可靠的定位。如圖15中所示出地,重定向表1500包括多個條目1502,諸如第一條目 150 和第二條目1502b??蓪⑷魏螖?shù)目的條目1502包括在重定向表1500中,包括成百的、 成千的、以及甚至更多數(shù)目的條目1502。每一條目1502包括局部標識符1504和已改變的塊偏移值1506。例如,第一條目150 包括第一局部標識符150 和第一已改變塊偏移值 1506a,且第二條目1502b包括第二局部標識符1504b和第二已改變塊偏移值1506b。局部標識符1504是將數(shù)據(jù)塊322最初存儲在塊容器304時分配給數(shù)據(jù)塊322的唯一局部標識符(圖13中的局部標識符1304)。已改變的塊偏移值1506是移動過的、具有相應的局部標識符1504的數(shù)據(jù)塊322的新塊偏移值。因此,可使用數(shù)據(jù)塊的位置指示符來訪問重定向表1500,以確定數(shù)據(jù)塊的已改變塊偏移值。例如,圖15中的局部標識符1504a可以是分配給圖14中的數(shù)據(jù)塊1014b的局部標識符??墒褂梅峙浣o數(shù)據(jù)塊1014b的局部標識符來訪問重定向表1500中的條目1502a, 以確定已改變的塊偏移值1506a,該已改變的塊偏移值1506a指示數(shù)據(jù)塊1014b在塊容器 304中的新位置。注意,重定向表1500可具有任何大小。例如,在一實施例中,重定向表1500的大小以(預先確定的數(shù)據(jù)塊的最大數(shù)目-預先確定的為壓縮而刪除的數(shù)據(jù)塊的最小數(shù)目)χ(重定向表條目的大小)為界。在一些情況下,數(shù)據(jù)塊的重新定位可能很少發(fā)生。在一實施例中,在確定了數(shù)據(jù)塊的已改變的塊偏移值之后,可將流映射中從該流映射指向數(shù)據(jù)塊的任何指針修改成該經改編的塊偏移值,并且可將條目1502從重定向表1500移除。在一些情況中,通過這種方式重定向表1500可能隨著時間的推移而沒有條目1502??梢愿鞣N方式來將條目添加到重定向表中。例如,圖16示出了根據(jù)一示例實施例的用于存儲數(shù)據(jù)流的流程圖1600。參考圖17描述流程圖1600如下。圖17示出了根據(jù)一示例實施例的數(shù)據(jù)塊重定向系統(tǒng)1700的框圖。如圖17中所示出地,數(shù)據(jù)塊重定向系統(tǒng) 1700包括重定向表調節(jié)器1702和階段增量器1704。例如,在一實施例中,可將數(shù)據(jù)塊重定向系統(tǒng)1700實現(xiàn)在圖1中的塊存儲接口 116中?;谟嘘P流程圖1600的討論,進一步的結構及操作的實施例對于相關領域的技術人員將是顯而易見的。描述流程圖1600如下。流程圖1600開始于步驟1602。在步驟1602,修改塊容器中的內容。例如,在一實施例中,可移動圖12的塊容器304中的一個或多個數(shù)據(jù)塊322??赏ㄟ^諸如碎片整理過程、 垃圾信息收集之后的壓縮過程或其他過程之類的維護任務(例如,圖1中的維護模塊106) 來移動這些數(shù)據(jù)塊322。在步驟1604中,將一個或多個條目添加到重定向表中,該一個或多個條目指示塊容器中的一個或多個數(shù)據(jù)塊的由于步驟1602而改變的塊偏移值。例如,如圖17所示出地, 重定向表調節(jié)器1702接收已移動數(shù)據(jù)塊指示1706,該已移動數(shù)據(jù)塊指示1706指示根據(jù)步驟1602的維護任務而在圖12的塊容器304中移動過的一個或多個數(shù)據(jù)塊322??蓮膱?zhí)行步驟1602的維護任務處接收已移動數(shù)據(jù)塊指示1706,并且已移動數(shù)據(jù)塊指示1706可指示 塊容器304的塊容器標識符、每一個已移動數(shù)據(jù)塊(例如,通過局部標識符1304)、以及已移動數(shù)據(jù)塊在塊容器304中的偏移。重定向表調節(jié)器1702被配置成將與已移動數(shù)據(jù)塊指示 1706中指示的一個或多個已移動數(shù)據(jù)塊322相對應的一個或多個條目1502添加至重定向表1500。例如,對于每一個已移動數(shù)據(jù)塊322,重定向表調節(jié)器1702生成條目1502,該條目 1502將已移動數(shù)據(jù)塊322的局部標識符指示為局部標識符1504并將該已移動數(shù)據(jù)塊322 的新偏移值指示為已改變的塊偏移值1506。在步驟1606,塊容器頭部中的階段指示由于步驟1602而增大。例如,如圖7中所示出地,階段增量器1704接收已移動數(shù)據(jù)塊指示1706,該已移動數(shù)據(jù)塊指示1706指示數(shù)據(jù)塊已在圖12的塊容器304中移動過了,如通過已移動數(shù)據(jù)塊指示1706中接收到的塊容器標識符來標識。因此,階段增量器1704修改塊容器304的塊容器階段指示1204。例如, 在一實施例中,塊容器階段指示1204可具有初始值0,并且每當在塊容器304中移動數(shù)據(jù)塊322時,都可增加塊容器階段指示1204來指示更高的階段值。在其他實施例中,可以其他方式來修改塊容器階段指示1204。因此,當使用存儲在引用流映射310中的數(shù)據(jù)塊標識符(圖13中的數(shù)據(jù)塊標識符 1300)來查找圖12的塊容器304中的數(shù)據(jù)塊322時,可檢查塊容器304的塊容器階段指示 1204以查看塊容器304的當前階段是否與數(shù)據(jù)塊標識符1300中的塊容器階段值1306相同。如果它們相同,則可將數(shù)據(jù)塊322定位在由數(shù)據(jù)塊標識符1300中的塊偏移值1306所指示的偏移處。如果不同,則讀取重定向表1500來確定數(shù)據(jù)塊322在塊容器304中的已改變偏移值。例如,圖18示出根據(jù)一示例實施例的用于定位塊容器中的數(shù)據(jù)塊的流程圖1800。 例如,可由圖11中的再水合模塊1102在從流映射再水合數(shù)據(jù)流時執(zhí)行流程圖1800。參考圖19描述流程圖1800如下。圖19根據(jù)一示例實施例示出再水合模塊1930的框圖,該再水合模塊1930與流容器302和塊容器304進行通信以根據(jù)數(shù)據(jù)流請求1019來再水合數(shù)據(jù)流。如圖19中所示出地,再水合模塊1930包括數(shù)據(jù)流組裝器1902、階段檢查器1906和數(shù)據(jù)塊檢索器1908?;谟嘘P流程圖1800的討論,進一步的結構及操作的實施例對于相關領域的技術人員將是顯而易見的。流程圖1800和系統(tǒng)19描述如下。在圖19中,數(shù)據(jù)流組裝器1902接收數(shù)據(jù)流請求1910,該數(shù)據(jù)流請求1910指示與要被再水合的數(shù)據(jù)流相對應的流映射(諸如,存儲在流容器302中的流映射1904)。數(shù)據(jù)流組裝器1902處理流映射1904,從而為被流映射1904引用的每一數(shù)據(jù)塊生成數(shù)據(jù)塊請求 1912。流程圖1800開始于步驟1802。在步驟1802中,接收對數(shù)據(jù)塊的請求,該請求包括數(shù)據(jù)塊的標識符,該數(shù)據(jù)塊標識符包括塊容器標識符、局部標識符、塊容器階段值和第一塊偏移值。例如,在一實施例中,由數(shù)據(jù)流組裝器1902所生成的數(shù)據(jù)塊請求1912可包括圖 13中的數(shù)據(jù)塊標識符1300,以標識所請求的數(shù)據(jù)塊322。如圖13中所示出地,數(shù)據(jù)塊標識符1300可包括所請求的數(shù)據(jù)塊322的塊容器標識符1302、局部標識符1304、塊容器階段值 1306和塊偏移值1306。定位具有與數(shù)據(jù)塊標識符1300中的塊容器標識符1302相匹配的塊容器標識符1202的塊容器。例如,所定位的塊容器可以是圖3中的塊容器304。檢索到所請求的數(shù)據(jù)塊之后,訪問所定位的塊容器。操作行進至步驟1804。在步驟1804,確定匹配塊容器標識符的塊容器的階段標識符是否匹配塊容器階段值。例如,如圖19中所示出地,階段檢查器1906接收對所請求的數(shù)據(jù)塊的數(shù)據(jù)塊請求1912。 階段檢查器1906訪問塊容器304(以上被標識為具有與所請求的數(shù)據(jù)塊322的塊容器標識符1302相匹配的塊容器標識符120 。階段檢查器1906被配置為將塊容器304的塊容器階段指示1204與所請求的數(shù)據(jù)塊322的塊容器階段值1306進行比較,并輸出階段匹配指示1914。如果它們的值不匹配(例如,塊容器階段指示1204的值大于所請求的數(shù)據(jù)塊 322的塊容器階段值1306的值),則階段匹配指示1914指示未找到匹配,并且操作行進至步驟1806。如果它們的值確實匹配,則階段匹配指示1914指示找到匹配,且操作行進至步驟1810,在步驟1810中可沿著用于檢索所請求的數(shù)據(jù)塊的標準I/O路徑(或,其他路徑) 而行。在步驟1806,搜索與塊容器相關聯(lián)的重定向表,以查找包括對局部標識符的匹配的條目,該條目包括與第一塊偏移值不同的第二塊偏移值。例如,如圖19中所示出地,數(shù)據(jù)塊檢索器1908接收階段匹配指示1914和數(shù)據(jù)塊請求1912。如果階段匹配指示1914指示在步驟1804中找到了匹配,則數(shù)據(jù)塊檢索器1908訪問重定向表1500以得到條目1502中具有局部標識符1504的已改變塊偏移值1506 (圖15),該局部標識符1504匹配于所請求的數(shù)據(jù)塊322的局部標識符1304。如圖19中所示出地,數(shù)據(jù)塊檢索器1908接收與塊偏移值 1306的第一塊偏移值不同的第二塊偏移值1916。操作行進至步驟1808。在步驟1808中,從塊容器檢索在第二塊偏移值處的數(shù)據(jù)塊。例如,如圖19中所示出地,數(shù)據(jù)塊檢索器1908訪問塊容器304以得到位于第二塊偏移值1916的數(shù)據(jù)塊H 數(shù)據(jù)塊32 是已在塊容器304中從塊偏移值1306移動至第二塊偏移值1916的所請求的數(shù)據(jù)塊322。如圖19中所示出地,數(shù)據(jù)塊檢索器1908輸出數(shù)據(jù)塊1918,在當前示例中數(shù)據(jù)塊 1918就是數(shù)據(jù)塊32&。數(shù)據(jù)塊1918被數(shù)據(jù)流組裝器1902接收。通過這種方式中,數(shù)據(jù)流組裝器1902從數(shù)據(jù)塊檢索器1908處接收被流映射1904引用的所有數(shù)據(jù)塊322,這些數(shù)據(jù)塊要么是根據(jù)相應的塊偏移值1306直接從塊容器304處檢索到的,要么是在被重定向表 1500進行重定向時從塊容器304處檢索到的。如圖19中所示出地,數(shù)據(jù)流組裝器1902生成數(shù)據(jù)流1920,該數(shù)據(jù)流1920是數(shù)據(jù)流請求1910中指示的所請求的數(shù)據(jù)流的再水合形式。 如此處到處描述地,數(shù)據(jù)流組裝器1902將檢索到的所有數(shù)據(jù)塊322組裝在一起來形成數(shù)據(jù)流 1920。注意,駐留在數(shù)據(jù)流的重解析點處的流映射引用標識符(例如,圖10中的流鏈接 1008a或1008b)可與圖13中的數(shù)據(jù)塊標識符1300具有相同的結構。如上所述,流映射310 可具有數(shù)據(jù)塊322的形式,其包含流映射元數(shù)據(jù)而不包含最終用戶文件數(shù)據(jù)。因此,定址流映射310的過程可與定址數(shù)據(jù)塊322相同——兩種技術都可使用數(shù)據(jù)塊標識符1300的結構。經優(yōu)化的數(shù)據(jù)流通過將流映射310的數(shù)據(jù)塊標識符1300放置在文件重分析點(附屬于實際數(shù)據(jù)流/文件對象)處來引用流映射310。流映射標識符包含[容器標識符、局部標識符、階段值、偏移值]信息,該信息可用于(直接地或者通過重定向表)將流映射310定位到流容器302內部的數(shù)據(jù)塊。因此,在一實施例中,流容器302的格式和布局可以與塊容器304的格式和布局實質上相同。D.示例性塊存儲碎片整理實施例位置是優(yōu)化數(shù)據(jù)訪問等待時間中的一個因素,其中在將與特定數(shù)據(jù)流相關聯(lián)的各數(shù)據(jù)塊順序地定位時,可更快速地訪問這些數(shù)據(jù)塊。如上所述,數(shù)據(jù)去重復會在數(shù)據(jù)流被分解成數(shù)據(jù)塊時引入碎片。常見的數(shù)據(jù)訪問模式是串行I/O操作。串行I/O可在應用程序將來自存儲的整個文件讀入內存時被執(zhí)行,從而在該過程中再水合文件。存儲中的文件內的任何碎片都將導致串行I/O操作中的盤查找,這些盤查找減少了 I/O的吞吐量并由此增加了再水合的等待時間。另外,額外的盤查找會給盤資源增加負荷。如果被塊存儲使用的盤是與其他數(shù)據(jù)共享的,則該盤上的額外負荷也將使有關該其他數(shù)據(jù)的I/O操作變慢。本小節(jié)提供各種碎片整理實施例,這些碎片整理實施例實現(xiàn)改進的數(shù)據(jù)塊等待時間以及減少的碎片。一些實施例可選定在數(shù)據(jù)去重復的級別和碎片的級別之間的折衷,以實現(xiàn)有關數(shù)據(jù)訪問的較少等待時間。例如,在一實施例中,通過增加相鄰塊序列的數(shù)目和/ 或長度來減少塊存儲中的碎片。“相鄰塊序列”是一組相鄰存儲的數(shù)據(jù)塊,該相鄰存儲的數(shù)據(jù)塊表示一個或多個經優(yōu)化數(shù)據(jù)流的數(shù)據(jù)段。在另一實施例中,可重組織存儲在塊存儲中的數(shù)據(jù)塊的次序,使得較可能被訪問的已存儲數(shù)據(jù)流具有相鄰存儲的數(shù)據(jù)塊,這是以較低優(yōu)先級的已存儲數(shù)據(jù)流為代價的。這些實施例可減少碎片和/或可基于再水合的可能性排定碎片整理的優(yōu)先級。例如,圖20示出了根據(jù)一示例實施例的用于存儲數(shù)據(jù)流的流程圖2000。出于說明的目的,參考圖21描述流程圖2000。圖21根據(jù)一示例實施例示出用于以優(yōu)化形式將數(shù)據(jù)流存儲在流容器302和塊容器304中的數(shù)據(jù)流存儲系統(tǒng)的框圖。在一實施例中,系統(tǒng)2102 可根據(jù)流程圖2000來操作。如圖21中所示出地,數(shù)據(jù)流存儲系統(tǒng)2102包括數(shù)據(jù)塊累積器 2104和流映射生成器2106。例如,在一實施例中,可將數(shù)據(jù)流存儲系統(tǒng)2102實現(xiàn)在圖1中的塊存儲接口 116中?;谟嘘P流程圖2000的討論,進一步的結構及操作的實施例對于相關領域的技術人員將是顯而易見的。流程圖2000和系統(tǒng)2102描述如下。流程圖2000開始于步驟2002。在步驟2002中,存儲對重復數(shù)據(jù)塊的最小可允許數(shù)的指示。例如,如圖21中所示出地,將指示2108存儲在系統(tǒng)2102中。指示2108是對可能被存儲在塊容器304中的重復數(shù)據(jù)塊的最小可允許數(shù)的指示。指示2108的值可以由用戶來提供、可以根據(jù)算法來計算、或者可以以其他方式來設定或確定。指示2108可以在根據(jù)流程圖2000優(yōu)化數(shù)據(jù)流之前預先設定,并且可按需改變。在一實施例中,可將指示2108 存儲在任何類型的存儲中,包括存儲器、硬盤驅動器、和/或此處到處提到的或以其他方式已知的其他類型的存儲中。例如,指示2108可以是大于1的整數(shù)。根據(jù)指示2108的值(例如,N值),數(shù)據(jù)流必須具有至少N個重復在先存儲文件中的那些數(shù)據(jù)塊的數(shù)據(jù)塊的“相鄰塊序列”,否則該數(shù)據(jù)塊序列中的數(shù)據(jù)塊將不會被優(yōu)化。操作從步驟2002行進至步驟2004。在步驟2004中,數(shù)據(jù)塊的序列是從數(shù)據(jù)流累積的。例如,如圖21中所示出地,數(shù)據(jù)塊累積器2104接收數(shù)據(jù)塊2114 (例如,圖1中的數(shù)據(jù)塊124),這些數(shù)據(jù)塊2114是來自數(shù)據(jù)流的數(shù)據(jù)塊的序列。數(shù)據(jù)塊累積器2104將各數(shù)據(jù)塊2114累積成序列。數(shù)據(jù)塊累積器 2104可將所接收的數(shù)據(jù)塊累積在存儲器或其他存儲中。操作從步驟2004行進至步驟2006。在步驟2006中,確定所累積的數(shù)據(jù)塊序列是否與已存儲的數(shù)據(jù)塊序列相匹配,已存儲的數(shù)據(jù)塊序列被相鄰地存儲在塊容器中。例如,如圖21出所示地,數(shù)據(jù)塊累積器2104 包括序列確定器2122。序列確定器2122被配置成將由數(shù)據(jù)塊累積器2104累積的數(shù)據(jù)塊序列與已經以相鄰的方式存儲在塊容器304中的數(shù)據(jù)塊的序列(例如,數(shù)據(jù)塊的重復序列) 進行比較。例如,如圖21中所示出地,數(shù)據(jù)塊累積器2104從流容器302接收流映射2112。 流映射2112包括具有存儲在塊容器304中的數(shù)據(jù)塊的數(shù)據(jù)流的流映射。流確定器2122可接收流映射2112,并可使用流映射2112的元數(shù)據(jù)來確定塊容器304中相鄰存儲的數(shù)據(jù)塊序列。例如,序列確定器2122可將相鄰存儲的數(shù)據(jù)塊序列確定為流映射2112中引用的、具有位置指示406(圖4)的相同值的那些數(shù)據(jù)塊。在其他實施例中,序列確定器2122可使用用于確定塊容器304中的相鄰存儲的數(shù)據(jù)塊序列的其他技術。如果由數(shù)據(jù)塊累積器2104累積的各數(shù)據(jù)塊的序列匹配于(是如下序列的重復)被流映射2112引用的、具有相同位置指示符406的各數(shù)據(jù)塊的序列,則序列確定器2112指示匹配被確定,并且操作從步驟2006行進至步驟2008。否則,序列確定器2122指示未找到匹配,并且操作行進至步驟2010。在步驟2008,確定所累積的序列是否包括大于或等于已存儲指示的數(shù)據(jù)塊數(shù)。例如,如圖21中所示出地,數(shù)據(jù)塊累積器2104包括序列比較器2110。序列比較器2110接收指示2108 (例如,從存儲處),并從數(shù)據(jù)塊累積器2104處接收所累積的數(shù)據(jù)塊序列。如果所累積的數(shù)據(jù)塊序列包括大于或等于指示2108的數(shù)據(jù)塊數(shù),則操作從步驟2008行進至步驟2102。否則,步驟再次行進至步驟2004,其中數(shù)據(jù)塊累積器2104從數(shù)據(jù)塊2114處累積下一數(shù)據(jù)塊(例如,作為“最后進入的”數(shù)據(jù)塊)。在步驟2010中,存儲所累積的序列中的第一數(shù)據(jù)塊,并將該第一數(shù)據(jù)塊從所累積的序列中移除。例如,參考圖21,數(shù)據(jù)塊累積器2104可將所累積的數(shù)據(jù)塊序列中的第一數(shù)據(jù)塊(例如,“最先進入的”數(shù)據(jù)塊)作為數(shù)據(jù)塊2118而存儲在塊容器304中當前存儲在塊容器304中的最后數(shù)據(jù)塊322之后(例如,圖21的示例中的數(shù)據(jù)塊32 之后)。將數(shù)據(jù)塊 2118從數(shù)據(jù)塊累積器2104中的所累積序列處移除。操作從步驟2010行進至步驟2004,在步驟2004中數(shù)據(jù)塊累積器2104從數(shù)據(jù)塊2114處累積下一數(shù)據(jù)塊(例如,作為“最后進入的”數(shù)據(jù)塊)。在步驟2012處,將指向已存儲數(shù)據(jù)塊序列的指針存儲在數(shù)據(jù)流的映射中。例如,如圖21中所示出地,數(shù)據(jù)塊累積器2103可為當前累積的數(shù)據(jù)塊序列生成存儲指針指示 2116。存儲指針指示2116由流映射生成器2106接收。流映射生成器2106被配置成生成與數(shù)據(jù)塊2114的數(shù)據(jù)流相對應的流映射2120。存儲指針指示2116指示流映射生成器2106 將所累積的數(shù)據(jù)塊序列中的各數(shù)據(jù)塊的每一個的指針(例如,數(shù)據(jù)塊標識符404)存儲在流映射中,以引用被確定為匹配該所累積的序列的已存儲的數(shù)據(jù)塊序列。流映射生成器2106 可以以(包括此處到處描述的)任何方式生成這些指針(例如,流映射生成器2106可包括圖6中的元數(shù)據(jù)生成器606)。將所累積的數(shù)據(jù)塊序列從數(shù)據(jù)塊累積器2104處移除,并且操作從步驟2012行進至步驟2004,在步驟2004處數(shù)據(jù)塊累積器2104從數(shù)據(jù)塊2114累積下一數(shù)據(jù)塊。注意,關于步驟2010,其中將數(shù)據(jù)塊2118存儲在塊容器304中,數(shù)據(jù)塊累積器 2104生成存儲指針指示2116來指令流映射生成器2106將數(shù)據(jù)塊2118的指針存儲在流映射2120中。此外,注意到可繼續(xù)流程圖2000直到數(shù)據(jù)塊2114中沒有接收到更多數(shù)據(jù)塊為止。在這種情況下,流映射生成器2106可完成對流映射2120的生成,并可將流映射2120 存儲在流容器302中。例如,在一示例中,對重復數(shù)據(jù)塊的最小可允許數(shù)的指示2108可以是5。數(shù)據(jù)塊累積器2104可累積四個數(shù)據(jù)塊,這四個數(shù)據(jù)塊復制(匹配)(如由序列確定器2122在步驟 2006中所確定的)已存儲的四個數(shù)據(jù)塊的序列。然而,序列比較器2110確定(在步驟2008 中)四個數(shù)據(jù)塊的數(shù)目小于指示2108的值。數(shù)據(jù)塊累積器2104累積第五個數(shù)據(jù)塊(在步驟2004中)。如果序列確定器2122確定(在步驟2006中)五個所累積的數(shù)據(jù)塊復制了已存儲的五個數(shù)據(jù)塊的序列,則序列比較器2110確定(在步驟2008)五個數(shù)據(jù)塊的數(shù)目等于指示2108的值,并且根據(jù)步驟2012來優(yōu)化這五個所累積的數(shù)據(jù)塊(例如,將指向已存儲的數(shù)據(jù)塊序列的指針用于由流映射生成器2106為這五個所累積的數(shù)據(jù)塊所生成的流映射中)。如果序列確定器2122已確定(在步驟2006中)這五個所累積的數(shù)據(jù)塊不匹配已存儲的五個數(shù)據(jù)塊的序列,則移出第一或“最舊”數(shù)據(jù)塊,并累積新的數(shù)據(jù)塊(在步驟2004)。注意,將流程圖2000的示例作為示例實施例來提供。在另一實施例中,可遵守“N 大小的相鄰組”,使得在嘗試將整個序列與另一數(shù)據(jù)流進行匹配之前施加新數(shù)據(jù)流中的N個塊的序列。此外,如果圖21中的系統(tǒng)2102由于碎片整理而存儲了已經存儲在塊容器304 中的數(shù)據(jù)塊,則系統(tǒng)2102可向具有新塊標識符的調用程序報告這個改變。相反,使用散列索引的解決方案可決定用相同塊的另一示例來更新該索引。根據(jù)圖20和21中的實施例,如果第二數(shù)據(jù)流中的N個相鄰數(shù)據(jù)塊重復第一流中的數(shù)據(jù)塊,則優(yōu)化第一數(shù)據(jù)流中的各數(shù)據(jù)塊,并且為第一數(shù)據(jù)流生成的流映射將引用第二數(shù)據(jù)流中的各數(shù)據(jù)塊。當對以這種方式存儲的數(shù)據(jù)流執(zhí)行再水合時,被執(zhí)行的盤查找被減少成對(NX數(shù)據(jù)塊大小)序列執(zhí)行的那些盤查找,而不是對單個塊大小序列執(zhí)行的盤查找,并且最大碎片是默認算法的1/N。同時,數(shù)據(jù)去重復率更低,因為數(shù)據(jù)塊未被優(yōu)化,并如果它們的重復不遵守N個相鄰塊條件,則為它們存儲重復數(shù)據(jù)塊。圖22示出了根據(jù)另一示例實施例的用于存儲數(shù)據(jù)流的流程圖2200。出于說明的目的,參考圖23來描述流程圖2200。圖23示出根據(jù)一示例實施例的用于將數(shù)據(jù)流以優(yōu)化形式存儲在流容器302和塊容器304中的數(shù)據(jù)流存儲系統(tǒng)2302的框圖。在一實施例中,系統(tǒng)2302可根據(jù)流程圖2200來操作。如圖23中所示出地,數(shù)據(jù)流存儲系統(tǒng)2302包括數(shù)據(jù)塊序列化器2304、流映射生成器2306和數(shù)據(jù)塊分段器2308。例如,在一實施例中,可將數(shù)據(jù)流存儲系統(tǒng)2302實現(xiàn)在圖1中的塊存儲接口 116中?;谟嘘P流程圖2200的討論,進一步的結構及操作的實施例對于相關領域的技術人員將是顯而易見的。流程圖2200和系統(tǒng)2302描述如下。流程圖2200開始于步驟2202。在步驟2202,存儲碎片因子。例如,如圖23中所示出地,碎片因子2310被存儲在系統(tǒng)2302中。碎片因子2310是對所接收數(shù)據(jù)流2314的指定部分所允許的碎片的最大數(shù)量的指示。碎片因子2310的值可以由用戶來提供、可以根據(jù)算法來計算、或者可以以其他方式來設定或確定??稍诟鶕?jù)流程圖2200來優(yōu)化數(shù)據(jù)流之前預先設定碎片因子2310,并且可按需改變該碎片因子。在一實施例中,可將碎片因子2310 存儲在任何類型的存儲中,包括存儲在存儲器、硬盤驅動器、和/或此處到處提到的或以其他方式已知的其他類型的存儲中。例如,碎片因子2310可以是大于一的整數(shù)。例如,在一個示例中,可將碎片因子2310定義成每1MB經優(yōu)化的數(shù)據(jù)含3個碎片組,或者可以具有其他值。在步驟2204中,接收包括多個數(shù)據(jù)塊的數(shù)據(jù)流的一部分。例如,如圖23中所示出地,數(shù)據(jù)塊序列化器2304接收數(shù)據(jù)流2314。數(shù)據(jù)塊序列化器2304可接收數(shù)據(jù)流2314的一部分來處理??山邮諗?shù)據(jù)流2314的任何部分大小,包括1MB、更大部分大小或更小部分大在出于說明目的而提供的一個示例中,數(shù)據(jù)塊序列化器2304可接收數(shù)據(jù)流2314 的1MB部分,該部分包括16個數(shù)據(jù)塊(具有大約64KB的平均數(shù)據(jù)塊大小)。在步驟2206中,確定多個數(shù)據(jù)塊中的多個數(shù)據(jù)塊序列,所確定的每一個數(shù)據(jù)塊序列包括與相鄰存儲在塊容器中的已存儲數(shù)據(jù)塊序列相匹配的數(shù)據(jù)塊序列。例如,數(shù)據(jù)塊序列化器2304可被配置成分析數(shù)據(jù)流2314的所接收部分,以確定此處與塊容器304中的已存儲數(shù)據(jù)塊序列相匹配的一個或多個數(shù)據(jù)塊序列。例如,如圖23中所示出地,數(shù)據(jù)塊序列化器2304從流容器302處接收數(shù)據(jù)流2312。流映射2312包括具有存儲在塊容器304中的數(shù)據(jù)塊的數(shù)據(jù)流的流映射。數(shù)據(jù)塊序列化器2304可接收流映射2312,并可使用流映射 2312中的元數(shù)據(jù)來確定塊容器304中相鄰存儲的數(shù)據(jù)塊序列。例如,由于在具有相同的位置指示符406(圖4)的值的流映射2312中引用的那些數(shù)據(jù)塊,數(shù)據(jù)塊序列化器2304可確定相鄰存儲的數(shù)據(jù)塊序列。在其他實施例中,數(shù)據(jù)塊序列化器2304可使用其他技術來確定塊容器304中相鄰存儲的數(shù)據(jù)塊序列。如圖23中所示出地,數(shù)據(jù)塊序列化器2304輸出經序列化的數(shù)據(jù)塊2316,該經序列化的數(shù)據(jù)塊2316指示包括在數(shù)據(jù)流2314的所接收部分中的所有數(shù)據(jù)塊,并指示哪些數(shù)據(jù)塊包括在數(shù)據(jù)塊序列中。例如,繼續(xù)以上示例,可在16個所接收數(shù)據(jù)塊中確定三個數(shù)據(jù)塊序列數(shù)據(jù)塊1-5 可以是不唯一的,它們匹配與第二數(shù)據(jù)流相關聯(lián)的五個已存儲數(shù)據(jù)塊的相鄰序列;數(shù)據(jù)塊 6可以是唯一的;數(shù)據(jù)塊7-8可以是不唯一的,它們匹配與第三數(shù)據(jù)流相關聯(lián)的兩個已存儲數(shù)據(jù)塊的相鄰序列;數(shù)據(jù)塊9可以是唯一的;以及,數(shù)據(jù)塊10-16可以是不唯一的,它們匹配與第四數(shù)據(jù)流相關聯(lián)的七個已存儲數(shù)據(jù)塊的相鄰序列。在步驟2208中,將多個數(shù)據(jù)塊分段成與碎片因子相對應的數(shù)目的數(shù)據(jù)塊組,其中所確定的每一個數(shù)據(jù)塊序列中的數(shù)據(jù)塊被一起包括在一數(shù)據(jù)塊組中。例如,如圖23中所示出地,數(shù)據(jù)塊序分段器2308接收經序列化的數(shù)據(jù)塊2316。數(shù)據(jù)塊分段器2308被配置成將經序列化的數(shù)據(jù)塊2316分段成與碎片因子2310相對應的數(shù)目的數(shù)據(jù)塊組,諸如少于或等于碎片因子2310的值的多個數(shù)據(jù)塊組。在一實施例中,數(shù)據(jù)塊分段器2308可被配制成以實現(xiàn)改進的和/或最大的數(shù)據(jù)去重復的方式來分段經序列化的數(shù)據(jù)塊2316,(例如,以最小化用于再水合相應的數(shù)據(jù)流的存儲查找的數(shù)目)。例如,在一個實施例中,數(shù)據(jù)塊分段器2308可被配置成分段經序列化的數(shù)據(jù)塊 2316,使得各數(shù)據(jù)塊組中的一個或多個各自僅包括數(shù)據(jù)塊序列(例如,僅包括包括在由數(shù)據(jù)塊序列化器2304所確定的在數(shù)據(jù)塊序列中的數(shù)據(jù)塊),并使得剩下的數(shù)據(jù)塊組各自包括各唯一的數(shù)據(jù)塊或者包括各唯一的數(shù)據(jù)塊和各數(shù)據(jù)塊序列的組合。被選擇來包括在僅包含數(shù)據(jù)塊序列的數(shù)據(jù)塊組中的各數(shù)據(jù)塊序列可以因為它們是最長的數(shù)據(jù)塊序列和/或是基于其他因子的而被選擇。例如,繼續(xù)以上示例,碎片因子2310可具有值三。在這一示例中,數(shù)據(jù)塊1-5(與第二數(shù)據(jù)流的數(shù)據(jù)塊序列相對應)可被包括在第一數(shù)據(jù)塊組中,數(shù)據(jù)塊6-9 (包括唯一的塊6、 與第三數(shù)據(jù)流的數(shù)據(jù)塊序列相對應的數(shù)據(jù)塊7和8、以及唯一的塊8)可被包括在第二數(shù)據(jù)塊組中,并且數(shù)據(jù)塊10-16(與第四數(shù)據(jù)流的數(shù)據(jù)塊序列相對應)可被包括在第三數(shù)據(jù)塊組中。在這個示例中,第一和第三數(shù)據(jù)塊組僅包括數(shù)據(jù)塊序列(數(shù)據(jù)塊1-5和數(shù)據(jù)塊10-16), 且第二數(shù)據(jù)塊組包括唯一的數(shù)據(jù)塊(數(shù)據(jù)塊6和數(shù)據(jù)塊9)以及數(shù)據(jù)塊序列(數(shù)據(jù)塊7-8) 的組合。因此,兩個最長的數(shù)據(jù)塊序列(數(shù)據(jù)塊1-5和數(shù)據(jù)塊10-16)各自包括在它們自己的數(shù)據(jù)塊組中。在步驟2210中,將數(shù)據(jù)塊的指向已存儲的數(shù)據(jù)塊序列的指針存儲在數(shù)據(jù)塊組的第一分組中。例如,在一實施例中,可將由數(shù)據(jù)塊分段器2308分配的各數(shù)據(jù)塊組分解成兩個分組數(shù)據(jù)塊組的第一分組,該第一分組僅包括數(shù)據(jù)塊序列;以及數(shù)據(jù)塊組的第二分組, 該第二分組僅包括唯一的數(shù)據(jù)塊或者包括唯一的數(shù)據(jù)塊和數(shù)據(jù)塊序列的組合。將數(shù)據(jù)塊組的第一分組作為重復來處理,這意味著取代將第一分組實際存儲在塊容器304中,而是將該第一分組作為指向已經存儲的匹配數(shù)據(jù)塊的指針來存儲。此外,將數(shù)據(jù)塊組的第二分組作為相鄰的新數(shù)據(jù)塊而存儲在塊容器304中。仍將第二分組中是已經存儲在塊容器304中的數(shù)據(jù)塊的重復的各數(shù)據(jù)塊存儲在塊容器304中,結果導致過多的“去重復丟失”數(shù)據(jù)塊, 但有助于減少碎片。如圖23中所示出地,數(shù)據(jù)塊分段器2308可為數(shù)據(jù)塊組的第一分組生成存儲指針指示2320。存儲指針指示2320被流映射生成器2306接收。流映射生成器2306被配置成生成與數(shù)據(jù)塊2314的數(shù)據(jù)流相對應的流映射2322。存儲指針指示2320指令流映射生成器2306將數(shù)據(jù)塊組的第一分組中每一個數(shù)據(jù)塊的指針(例如,數(shù)據(jù)塊標識符404)存儲在流映射2322中,以引用與第一分組中的數(shù)據(jù)塊序列相匹配的已存儲數(shù)據(jù)塊序列。流映射生成器2306可以包括如此處到處描述的任何方式來生成這些指針(例如,流映射生成器2306 可包括圖6中的元數(shù)據(jù)生成器606)。例如,繼續(xù)以上示例,數(shù)據(jù)塊分段器2308可包括第一分組中的第一和第三數(shù)據(jù)塊組(數(shù)據(jù)塊1-5和數(shù)據(jù)塊10-16)。數(shù)據(jù)塊分段器2308可生成存儲指針指示2320來指示指向與數(shù)據(jù)塊1-5和數(shù)據(jù)塊10-16相對應的已存儲的數(shù)據(jù)塊序列的指針要被存儲在數(shù)據(jù)塊 1-5和數(shù)據(jù)塊10-16的流映射2322中。在步驟2212中,將多個數(shù)據(jù)塊中除數(shù)據(jù)塊組的第一分組中的那些數(shù)據(jù)塊以外的數(shù)據(jù)塊存儲在塊容器中。例如,在一實施例中,數(shù)據(jù)塊分段器2308可將數(shù)據(jù)塊2318存儲在塊容器304中。數(shù)據(jù)塊2318包括由數(shù)據(jù)塊分段器2308分配的數(shù)據(jù)塊組的第二分組中的各數(shù)據(jù)塊。而且,數(shù)據(jù)塊分段器2308可為數(shù)據(jù)塊組的第二分組生成第二存儲指針指示2320。 第二存儲指針指示2320被流映射生成器2306接收。第二存儲指針指示2320指令流映射生成器將指向在步驟2212處新近存儲在塊容器304中的每一個數(shù)據(jù)塊2318的指針存儲在流映射2322中。例如,繼續(xù)以上示例,數(shù)據(jù)塊分段器2308可包括第二分組中的第二數(shù)據(jù)塊組(數(shù)據(jù)塊6-9)。數(shù)據(jù)塊6-9可以被新近存儲在塊容器304中當前存儲于其中的最后數(shù)據(jù)塊之后。數(shù)據(jù)塊分段器2308可生成第二存儲指針指示2320來指示指向塊容器中新近存儲的數(shù)據(jù)塊6-9的指針要被存儲在流映射2322中。因此,在這個示例中,當與數(shù)據(jù)塊1-16相對應的數(shù)據(jù)流被再水合時,該1MB部分的碎片被限制為三個,并且因此執(zhí)行不多于三個的盤查找(對數(shù)據(jù)塊1-5的第一查找、對數(shù)據(jù)塊6-9的第二查找、對數(shù)據(jù)塊10-16的第三查找)。相反,如果數(shù)據(jù)流被全部優(yōu)化,則將存在與以下五組數(shù)據(jù)塊相對應的五個盤查找1-5、6、7-8、9、10-16。因此,根據(jù)與流程圖2200和圖23相對應的各實施例,數(shù)據(jù)去重復率可被減少,從而使得碎片被限制并且是可預測的。圖對和25示出根據(jù)另一示例實施例的用于重組織已存儲數(shù)據(jù)流的流程圖MOO 和2500。出于說明的目的,參考圖沈來描述流程圖MOO和2500。圖沈示出根據(jù)一示例實施例的用于重組織使用流容器302和塊容器30 來存儲的各數(shù)據(jù)塊的存儲重組織系統(tǒng) 2602的框圖。在一實施例中,系統(tǒng)沈02可根據(jù)流程圖MOO和2500來操作。如圖沈中所示出地,存儲重組織系統(tǒng)2602包括數(shù)據(jù)塊重組織器沈04和數(shù)據(jù)流優(yōu)先級區(qū)分器沈06。例如,在一實施例中,可將存儲重組織系統(tǒng)沈02實現(xiàn)在圖1中的塊存儲接口 116或維護模塊 106中?;谟嘘P流程圖MOO和2500的討論,進一步的結構及操作的實施例對于相關領域的技術人員將是顯而易見的。流程圖MOO和2500以及系統(tǒng)沈02描述如下。流程圖MOO開始于步驟M02。在步驟M02中,排定作為塊容器中的數(shù)據(jù)塊以及作為包括指向相應數(shù)據(jù)塊的指針的流映射來存儲的多個數(shù)據(jù)流的優(yōu)先級。例如,如圖沈中所示出地,數(shù)據(jù)塊重組織器沈04接收塊存儲重組織請求沈10。塊存儲重組織請求沈10對所分配的塊存儲(諸如,與流容器302和塊容器30 相對應的塊存儲)進行重組織的請求。請求沈10可以從用戶處接收、可以自動生成(例如,基于周期性的或非周期性的)、或者可以具有其他來源。數(shù)據(jù)流優(yōu)先級區(qū)分器2606被配置成排定由塊存儲所存儲的數(shù)據(jù)流的優(yōu)先級,該塊存儲包括流容器302和塊容器30如。例如,在一實施例中,數(shù)據(jù)流優(yōu)先級區(qū)分器沈06可被配置成使用以下各種規(guī)范來分析/計算試探(heuristics),諸如熱門度索引(或者對訪問頻率的其他指示),它指示每一數(shù)據(jù)流最近是如何被訪問的(較頻繁地被訪問的數(shù)據(jù)流可被給予較高的優(yōu)先級);場景或應用(例如,由某一應用使用的數(shù)據(jù)流可比其他數(shù)據(jù)流具有高的優(yōu)先級);數(shù)據(jù)流屬性(諸如所存儲的、關于Microsoft Windows (微軟視窗 )的各文件的FCI (文件分類基礎結構)屬性);和/或其他規(guī)范??墒褂迷囂揭耘判蚧虼涡?例如,以從最高優(yōu)先級數(shù)據(jù)流到最低優(yōu)先級數(shù)據(jù)流的次序)來排定數(shù)據(jù)流的優(yōu)先級。如圖沈中所示出地,數(shù)據(jù)流優(yōu)先級區(qū)分器沈06生成數(shù)據(jù)流優(yōu)先級沈08。注意, 在一實施例中,可將數(shù)據(jù)流優(yōu)先級2608的數(shù)據(jù)流優(yōu)先級存儲在具有流映射沈12的流容器 302中(例如,存儲在每一流映射的流映射元數(shù)據(jù)中)。
在步驟M04中,根據(jù)優(yōu)先順序來確定多個數(shù)據(jù)流中的已存儲數(shù)據(jù)塊的重組織。例如,如圖沈中所示出地,數(shù)據(jù)塊重組織器沈04接收數(shù)據(jù)流優(yōu)先級沈08。數(shù)據(jù)塊重組織器 2604被配置成根據(jù)數(shù)據(jù)流優(yōu)先級沈08來重組織存儲在塊容器30 中的數(shù)據(jù)塊沈16。例如,數(shù)據(jù)塊重組織器2604可被配置成一個數(shù)據(jù)流接一個數(shù)據(jù)流地重組織各數(shù)據(jù)流中的數(shù)據(jù)塊,該重組織起始于最高優(yōu)先級數(shù)據(jù)流并終止于最低優(yōu)先級數(shù)據(jù)流。在一實施例中,數(shù)據(jù)塊重組織器沈04被配置成重新定位或重新分配塊容器30 中的數(shù)據(jù)塊,以在該重新定位不會導致具有較高優(yōu)先級的數(shù)據(jù)流比重定位后的數(shù)據(jù)塊的數(shù)據(jù)流具有增加的碎片時,僅重新定位數(shù)據(jù)塊。在步驟M06中,根據(jù)所確定的重組織來生成用于存儲多個數(shù)據(jù)流中的數(shù)據(jù)塊的第二塊容器。例如,如圖沈所示出地,數(shù)據(jù)塊重組織器沈04可生成第二塊容器304b (例如, 如本文別處描述的)。數(shù)據(jù)塊重組織器沈04將重組織后的數(shù)據(jù)塊沈14存儲在第二塊容器 304b中。注意,第一塊容器30 中的數(shù)據(jù)塊沈16以及第二塊容器304b中的重組織后的數(shù)據(jù)塊沈14可包括相同的數(shù)據(jù)塊。然而,重組織后的數(shù)據(jù)塊沈14在第二塊容器304b中所具有的存儲次序與數(shù)據(jù)塊2616在第一塊容器30 中的存儲次序不同。注意,在一替換實施例中,并不生成第二塊容器304b來存儲經識別的數(shù)據(jù)塊1614,而是可將經識別的數(shù)據(jù)塊 2614存儲在第一數(shù)據(jù)塊容器30 中。在步驟M08中,將流映射的指針修改成指向存儲在第二塊容器中的數(shù)據(jù)塊。例如,如圖沈中所示出地,數(shù)據(jù)塊重組織器沈04可生成存儲在流映射沈12中的經更新的指針沈18。經更新的指針沈18包括指向重組織后的數(shù)據(jù)塊沈14在第二塊容器304b中的新位置的指針,這些指針替換之前存儲在流映射2612中的、指向數(shù)據(jù)塊沈16在第一塊容器 30 中的位置的指針。因此,在各實施例中,數(shù)據(jù)塊重組織器沈04可重新分配塊容器中的數(shù)據(jù)塊,以便這些數(shù)據(jù)塊以如下方式來存儲較高優(yōu)先級的數(shù)據(jù)流可具有比較低優(yōu)先級的數(shù)據(jù)流具有的碎片更少的碎片。例如,在一實施例中,根據(jù)圖25中的流程圖2500,步驟M04可由數(shù)據(jù)塊重組織器沈04以較高優(yōu)先級的數(shù)據(jù)流到較低優(yōu)先級的數(shù)據(jù)流的次序對每一數(shù)據(jù)流執(zhí)行。 在步驟2502,選擇數(shù)據(jù)流??赡芤呀浉鶕?jù)在此描述的或以其他方式已知的過程對所選的數(shù)據(jù)流進行了去重復。在步驟2504中,通過轉移比所選的數(shù)據(jù)流具有更低優(yōu)先級的數(shù)據(jù)流中的至少一個數(shù)據(jù)塊,將由所選的數(shù)據(jù)流的流映射的指針所指向的一個或多個數(shù)據(jù)塊重定位成比重定位之前更為相鄰。在其他實施例中,數(shù)據(jù)塊重組織器沈04可以以其他方式來重新分配塊容器中的數(shù)據(jù)塊。因此,流程圖MOO和2500以及圖沈中的各實施例執(zhí)行后臺掃描以及對塊存儲的重組織,使得在不破壞去重復的節(jié)約的情況下改變數(shù)據(jù)塊位置。例如,第一數(shù)據(jù)流可能之前已被優(yōu)化成具有相鄰存儲在塊容器30 中的數(shù)據(jù)塊{C1,C2,C3,C4,C5}。第二數(shù)據(jù)流可能之后已被優(yōu)化成具有數(shù)據(jù)塊IC3,C4,C5,C6,C7},使得數(shù)據(jù)塊C3-C5以指向塊容器30 中的第一數(shù)據(jù)流中的C3-C5的指針的方式來存儲。因此,第一和第二數(shù)據(jù)流可被存儲成Cl, C2,C3,C4,C5. . . C6,C7 (其中“...”表示一個或多個中間數(shù)據(jù)塊)。在這種情況下,對第一數(shù)據(jù)流的再水合并不使用任何額外的查找。然而,對第二數(shù)據(jù)流的再水合使用(從C3、C4、 C5移動到C6、C7的)額外的盤查找,因為數(shù)據(jù)塊C3-C5被存儲在經優(yōu)化的第一數(shù)據(jù)流中, 而第二數(shù)據(jù)塊C6-C7被存儲在經優(yōu)化的第二數(shù)據(jù)流中。
然而,在這個示例中,第二數(shù)據(jù)流可具有比第一數(shù)據(jù)流多十倍的數(shù)據(jù)訪問的可能性。因此,第二數(shù)據(jù)流可具有比第一數(shù)據(jù)流更高的優(yōu)先級,并因此可以根據(jù)流程圖MOO和 2500以及圖沈中的各實施例以第一數(shù)據(jù)流為代價優(yōu)化第二數(shù)據(jù)流。例如,各數(shù)據(jù)塊可被重組織,從而使得塊C3-C7而非塊C1-C5被相鄰地存儲。例如,如上所示出地,之前的數(shù)據(jù)塊存儲安排可以是(1^2丄3^4,〇5. · · C6,C7。重組織后的數(shù)據(jù)塊存儲安排可以是Cl,C2. . . C3, C4,C5,C6,C7,其中數(shù)據(jù)塊C3-C5被移動成與數(shù)據(jù)塊C6和C7相鄰。此外,與第一和第二數(shù)據(jù)流相對應的流映射可被修改成指向數(shù)據(jù)塊C1-C7的新位置。在執(zhí)行了這個碎片整理后, 對第一數(shù)據(jù)流的再水合使用一個盤查找(來將盤頭部從Cl,C2移除至C3,C4,C5),而對第二數(shù)據(jù)流的再水合并不使用任何盤查找。III.示例計算設備實施例數(shù)據(jù)去重復模塊104、維護模塊106、數(shù)據(jù)流API 110、塊維護API 112、數(shù)據(jù)訪問 API 114、塊存儲接口 116、數(shù)據(jù)流解析器602、數(shù)據(jù)塊存儲管理器604、元數(shù)據(jù)生成器606、 流映射生成器608、元數(shù)據(jù)收集器802、位置指示符生成器804、再水合模塊1102、重定向表調節(jié)器1702、階段增量器1704、數(shù)據(jù)流組裝器1902、階段檢查器1906、數(shù)據(jù)塊檢索器1908、 數(shù)據(jù)流存儲系統(tǒng)2102、數(shù)據(jù)庫累積器2104、流映射生成器2106、序列比較器2110、序列確定器2122、數(shù)據(jù)流存儲系統(tǒng)2302、數(shù)據(jù)塊序列化器2304、流映射生成器2306、數(shù)據(jù)塊分段器2308、存儲重組織系統(tǒng)沈02、數(shù)據(jù)塊重組織器2604、以及數(shù)據(jù)流優(yōu)先級區(qū)分器沈06可以被實現(xiàn)在硬件、軟件、固件或其組合中。例如,數(shù)據(jù)去重復模塊104、維護模塊106、數(shù)據(jù)流 API 110、塊維護API 112、數(shù)據(jù)訪問API 114、塊存儲接口 116、數(shù)據(jù)流解析器602、數(shù)據(jù)塊存儲管理器604、元數(shù)據(jù)生成器606、流映射生成器608、元數(shù)據(jù)收集器802、位置指示符生成器 804、再水合模塊1102、重定向表調節(jié)器1702、階段增量器1704、數(shù)據(jù)流組裝器1902、階段檢查器1906、數(shù)據(jù)塊檢索器1908、數(shù)據(jù)流存儲系統(tǒng)2102、數(shù)據(jù)庫累積器2104、流映射生成器 2106、序列比較器2110、序列確定器2122、數(shù)據(jù)流存儲系統(tǒng)2302、數(shù)據(jù)塊序列化器2304、流映射生成器2306、數(shù)據(jù)塊分段器2308、存儲重組織系統(tǒng)沈02、數(shù)據(jù)塊重組織器沈04、和/或數(shù)據(jù)流優(yōu)先級區(qū)分器2606可被實現(xiàn)為被配置成在一個或多個處理器中執(zhí)行的計算機程序代碼?;蛘撸瑪?shù)據(jù)去重復模塊104、維護模塊106、數(shù)據(jù)流API 110、塊維護API 112、數(shù)據(jù)訪問API 114、塊存儲接口 116、數(shù)據(jù)流解析器602、數(shù)據(jù)塊存儲管理器604、元數(shù)據(jù)生成器606、 流映射生成器608、元數(shù)據(jù)收集器802、位置指示符生成器804、再水合模塊1102、重定向表調節(jié)器1702、階段增量器1704、數(shù)據(jù)流組裝器1902、階段檢查器1906、數(shù)據(jù)塊檢索器1908、 數(shù)據(jù)流存儲系統(tǒng)2102、數(shù)據(jù)庫累積器2104、流映射生成器2106、序列比較器2110、序列確定器2122、數(shù)據(jù)流存儲系統(tǒng)2302、數(shù)據(jù)塊序列化器2304、流映射生成器2306、數(shù)據(jù)塊分段器 2308、存儲重組織系統(tǒng)沈02、數(shù)據(jù)塊重組織器沈04、和/或數(shù)據(jù)流優(yōu)先級區(qū)分器沈06可被實現(xiàn)為硬件邏輯/電子電路。圖27描繪了其中可以實現(xiàn)本發(fā)明的各實施例的計算機2700的示例性實現(xiàn)。例如, 存儲系統(tǒng)102和/或其任何部分可被實現(xiàn)在類似于計算機2700的一個或多個計算機系統(tǒng)中,這些計算機系統(tǒng)包括計算機2700的一個或多個特征和/或各另外的特征。計算機2700 可以是例如常規(guī)個人計算機、移動計算機或工作站形式的通用計算設備,或者,計算機2700 可以是特殊用途的計算設備。此處所提供的對計算機2700的描述只是為了說明,并不是限制性的。如相關領域的技術人員所知道的,本發(fā)明的各實施例可以在其他類型的計算機系統(tǒng)中實現(xiàn)。如圖27所示,計算機2700包括處理單元2702、系統(tǒng)存儲器2704,以及將包括系統(tǒng)存儲器2706的各種系統(tǒng)組件耦合到處理單元2704的總線2702。系統(tǒng)總線2706表示若干類型的總線結構中的任何一種總線結構的一個或多個,包括存儲器總線或存儲器控制器、 外圍總線、加速圖形端口,以及使用各種總線體系結構中的任何一種的處理器或局部總線。 系統(tǒng)存儲器2704包括只讀存儲器(ROM) 2708和隨機存取存儲器(RAM) 2710?;据斎?輸出系統(tǒng)2712 (BIOS)存儲在ROM 2708中。計算機2700還具有一個或多個以下驅動器用于讀寫硬盤的硬盤驅動器2714、用于讀或寫可移動磁盤2718的磁盤驅動器2716、以及用于讀或寫諸如⑶R0M、DVD ROM或其他光介質之類的可移動光盤2722的光盤驅動器2720。硬盤驅動器2714、磁盤驅動器2716, 以及光驅動器2720分別通過硬盤驅動器接口 2724、磁盤驅動器接口 2726,以及光學驅動器接口 27 連接到系統(tǒng)總線2706。驅動器以及它們相關聯(lián)的計算機可讀介質為計算機提供了對計算機可讀指令、數(shù)據(jù)結構、程序模塊,及其他數(shù)據(jù)的非易失存儲器。雖然描述了硬盤、可移動磁盤和可移動光盤,但是,也可以使用諸如閃存卡、數(shù)字視頻盤、隨機存取存儲器 (RAM)、只讀存儲器(ROM)等等之類的其他類型的計算機可讀介質來存儲數(shù)據(jù)。數(shù)個程序模塊可被存儲在硬盤、磁盤、光盤、ROM,或RAM上。這些程序包括操作系統(tǒng)2730、一個或多個應用程序2732、其他程序模塊2734,以及程序數(shù)據(jù)2736。應用程序2732 或程序模塊2734可包括例如用于實現(xiàn)以下各項的計算機程序邏輯數(shù)據(jù)去重復模塊104、 維護模塊106、數(shù)據(jù)流API 110、塊維護API 112、數(shù)據(jù)訪問API 114、塊存儲接口 116、數(shù)據(jù)流解析器602、數(shù)據(jù)塊存儲管理器604、元數(shù)據(jù)生成器606、流映射生成器608、元數(shù)據(jù)收集器 802、位置指示符生成器804、再水合模塊1102、重定向表調節(jié)器1702、階段增量器1704、數(shù)據(jù)流組裝器1902、階段檢查器1906、數(shù)據(jù)塊檢索器1908、數(shù)據(jù)流存儲系統(tǒng)2102、數(shù)據(jù)庫累積器2104、流映射生成器2106、序列比較器2110、序列確定器2122、數(shù)據(jù)流存儲系統(tǒng)2302、數(shù)據(jù)塊序列化器2304、流映射生成器2306、數(shù)據(jù)塊分段器2308、存儲重組織系統(tǒng)沈02、數(shù)據(jù)塊重組織器沈04、數(shù)據(jù)流優(yōu)先級區(qū)分器沈06、流程圖700-、流程圖900、流程圖1600、流程圖 1800、流程圖2000、流程圖2200、流程圖M00、和/或流程圖2500(包括流程圖700、900、 1600、1800、2000、2200、2400 和 2500 中的任何步驟)。用戶可以通過諸如鍵盤2738和定點設備2740之類的輸入設備向計算機2700中輸入命令和信息。其他輸入設備(未示出)可包括話筒、操縱桿、游戲手柄、圓盤式衛(wèi)星天線、掃描儀等。這些及其他輸入設備常常通過耦合到總線2702的串行端口接口 2742連接到處理單元2706,但是,也可以通過其他接口,諸如并行端口、游戲端口、通用串行總線(USB) 端口,來進行連接。顯示設備2744也通過諸如視頻適配器2746之類的接口連接到總線2706。除了監(jiān)視器之外,計算機2700還可包括其他外圍輸出設備(未示出),如揚聲器和打印機。計算機2700通過適配器或網絡接口 2750、調制解調器2752、或用于通過網絡建立通信的其他裝置連接到網絡2748 (例如,因特網)。調制解調器2752 (可以是內置的或外置的),通過串行端口接口 2742連接到系統(tǒng)總線2706。如此處所使用的,術語“計算機程序介質”和“計算機可讀介質”被用來泛指諸如與硬盤驅動器2714相關聯(lián)的硬盤、可移動磁盤2718、可移動光盤2722,以及諸如閃存卡、數(shù)字視頻盤、隨機存取存儲器(RAM)、只讀存儲器(ROM)等等之類的其他介質。如上文所指示的,計算機程序和模塊(包括應用程序2732及其他程序模塊2734) 可被存儲在硬盤、磁盤、光盤、ROM或RAM上。這樣的計算機程序也可以通過網絡接口 2750 或串行端口接口 2742來接收。這樣的計算機程序,當由應用程序執(zhí)行或加載時,使得計算機2700能實現(xiàn)此處所討論的本發(fā)明的特征。相應地,這樣的計算機程序表示計算機2700 的控制器。本發(fā)明還涉及包括存儲在任何計算機可使用介質上的軟件的計算機程序產品。這樣的軟件,當在一個或多個數(shù)據(jù)處理設備中執(zhí)行時,使數(shù)據(jù)處理設備如此處所描述的那樣操作。本發(fā)明的各實施例使用現(xiàn)在已知的或將來已知的任何計算機可使用或計算機可讀介質。計算機可讀介質的示例包括,但不僅限于,諸如RAM、硬盤驅動器、軟盤、⑶ROM、DVD ROM、zip磁盤、磁帶、磁存儲設備、光存儲設備、MEM(存儲器)、基于納米技術的存儲設備等等之類的存儲設備。VI.結論盡管上文描述了本發(fā)明的各實施例,但是,應該理解,它們只是作為示例來呈現(xiàn)的,而不作為限制。那些精通有關技術的人員將理解,在不偏離如所附權利要求書所定義的本發(fā)明的精神和范圍的情況下,可以在形式和細節(jié)方面進行各種修改。因此,本發(fā)明的范圍不應該受到上述示例性實施例的任一個的限制,而只應根據(jù)下面的權利要求和它們的等效內容進行定義。
權利要求
1.一種方法(700),包括將數(shù)據(jù)流解析(70 成數(shù)據(jù)塊序列;確定(704)所述數(shù)據(jù)塊序列中的任何一個數(shù)據(jù)塊是否被存儲在包括多個數(shù)據(jù)塊的塊容器中;以及將所述數(shù)據(jù)塊序列中被確定為沒有存儲在所述塊容器內的各數(shù)據(jù)塊以相鄰的排列并在所述塊容器中以與所述數(shù)據(jù)流中的順序相同的順序存儲(706)在所述塊容器中。
2.根據(jù)權利要求1所述的方法,其特征在于,還包括生成所述數(shù)據(jù)塊序列中的每一個數(shù)據(jù)塊的元數(shù)據(jù),所述數(shù)據(jù)塊序列中的數(shù)據(jù)塊的元數(shù)據(jù)包括該數(shù)據(jù)塊在所述數(shù)據(jù)流中的偏移、指向該數(shù)據(jù)塊在所述塊容器中的位置的指針、以及該數(shù)據(jù)塊的位置指示符。
3.根據(jù)權利要求2所述的方法,其特征在于,還包括生成所述數(shù)據(jù)流的流映射,所述流映射包括所生成的元數(shù)據(jù);以及將所述流映射持久存儲在塊存儲中,所述塊存儲包括所述塊容器。
4.根據(jù)權利要求1所述的方法,其特征在于,還包括將第二數(shù)據(jù)流解析成第二數(shù)據(jù)塊序列;確定所述第二數(shù)據(jù)塊序列的第一組數(shù)據(jù)塊包括一個或多個數(shù)據(jù)塊,該一個或多個數(shù)據(jù)塊是已經存儲在所述塊容器中的各數(shù)據(jù)塊的重復,并確定所述第二數(shù)據(jù)塊序列的第二組數(shù)據(jù)沒有被存儲在所述塊容器中;將所述第二組數(shù)據(jù)塊以接著所述第一數(shù)據(jù)塊序列中的已存儲數(shù)據(jù)塊的相鄰的排列并以與所述第二數(shù)據(jù)流中的順序相同的順序存儲在所述塊容器中;以及存儲所述第一組數(shù)據(jù)塊中的每一個數(shù)據(jù)塊的、指向已經存儲在所述塊容器中的相應數(shù)據(jù)塊的指針。
5.如權利要求4所述的方法,其特政在于,所述第二數(shù)據(jù)流中的每一個數(shù)據(jù)塊具有相關聯(lián)的元數(shù)據(jù),該相關聯(lián)的元數(shù)據(jù)包括該數(shù)據(jù)塊在所述第二數(shù)據(jù)流中的偏移、指向該數(shù)據(jù)塊在所述塊容器中的位置的指針、以及該數(shù)據(jù)塊的位置指示符,其中所述第一數(shù)據(jù)塊序列中的每一個數(shù)據(jù)塊具有所述位置指示符的第一值,所述方法還包括將所述第一值分配給所述第一組數(shù)據(jù)塊中的每一個數(shù)據(jù)塊的位置指示符;選擇與所述第二數(shù)據(jù)流相關聯(lián)的新位置指示符值;以及將所述新位置指示符值分配給所述第二組數(shù)據(jù)塊中的每一個數(shù)據(jù)塊的位置指示符。
6.根據(jù)權利要求1所述的方法,其特征在于,還包括響應于對數(shù)據(jù)流的請求執(zhí)行第一查找,以在所述塊容器中定位所請求的數(shù)據(jù)流的第一組數(shù)據(jù)塊中的第一個數(shù)據(jù)塊,從所述塊容器順序地讀取所述第一組數(shù)據(jù)塊,執(zhí)行第二查找,以在所述塊容器中定位所請求的數(shù)據(jù)流中的第二組數(shù)據(jù)塊中的第一個數(shù)據(jù)塊,從所述塊容器順序地讀取所述第二組數(shù)據(jù)塊,
7.根據(jù)權利要求1所述的方法,其特征在于,還包括生成與所述塊容器相關聯(lián)的重定向表,所述重定向表存儲關于數(shù)據(jù)塊位置改變的信肩、ο
8.根據(jù)權利要求7所述的方法,其特征在于,還包括接收對數(shù)據(jù)塊的請求,所述請求包括該數(shù)據(jù)塊的標識符,所述數(shù)據(jù)塊標識符包括塊容器標識符、局部標識符、塊容器階段值和第一塊偏移值;確定所述塊容器的與在所述請求中接收到的塊容器標識符相匹配的階段指示并不與在所述請求中接收到的塊容器階段值相匹配;搜索所述重定向表,以得到包括所述局部標識符的匹配的條目,該條目包括與所述第一塊偏移值不同的第二塊偏移值;以及從所述塊容器檢索在所述第二塊偏移值處的數(shù)據(jù)塊。
9.如權利要求8所述的方法,其特征在于,所述塊容器的所述階段指示以及所述塊容器標識符被包括在所述塊容器的頭部中,所述方法還包括修改所述塊容器的內容;將一個或多個條目添加到所述重定向表中,所述一個或多個條目指示所述塊容器中的一個或多個數(shù)據(jù)塊由于所述修改而改變的塊偏移值;以及由于所述修改,增加所述塊容器頭部中的所述階段指示。
10.如權利要求7所述的方法,其特征在于,所述關于數(shù)據(jù)塊位置改變的信息將不可變的每個容器的塊標識符映射至新偏移值。
11.根據(jù)權利要求8所述的方法,其特征在于,還包括在與所述數(shù)據(jù)流相關聯(lián)的流映射中將所述第一塊偏移值替換成所述第二塊偏移值;以及從所述重定向表中刪除所述條目。
12.—種計算機程序產品,包括其上記錄有計算機程序邏輯的計算機可讀介質,包括用于使處理器能夠執(zhí)行權利要求1-11中的任何一項的計算機程序邏輯裝置0734)。
13.一種系統(tǒng)(600),包括數(shù)據(jù)流解析器,它被配置成將數(shù)據(jù)流(610)解析(70 成數(shù)據(jù)塊序列(612);數(shù)據(jù)塊存儲管理器(604),它被配置成確定所述數(shù)據(jù)塊序列(612)中的任何一個數(shù)據(jù)塊是否被存儲在包括多個數(shù)據(jù)塊(322)的塊容器(304)中,并且被配置成以相鄰的排列并以與所述數(shù)據(jù)流(610)中的順序相同的順序將所述數(shù)據(jù)塊序列(612)中被確定為沒有存儲在所述塊容器(304)中的各數(shù)據(jù)塊存儲在所述塊容器(304)中。
14.如權利要求13所述的系統(tǒng),其特征在于,還包括元數(shù)據(jù)生成器,它被配置成生成所述數(shù)據(jù)塊序列中的每一個數(shù)據(jù)塊的元數(shù)據(jù),所述數(shù)據(jù)塊序列中的數(shù)據(jù)塊的元數(shù)據(jù)包括該數(shù)據(jù)塊在所述數(shù)據(jù)流中的偏移、指向該數(shù)據(jù)塊在所述塊容器中的位置的指針、以及該數(shù)據(jù)塊的位置指示符。
15.如權利要求14所述的系統(tǒng),其特征在于,還包括流映射生成器,它被配置成生成所述數(shù)據(jù)流的流映射,所述流映射包括所生成的元數(shù)據(jù),并被配置成將所述流映射持久存儲在塊存儲中,所述塊存儲包括所述塊容器。
全文摘要
本發(fā)明涉及用于數(shù)據(jù)去重復的可縮放塊存儲??梢砸粤饔成浜蛿?shù)據(jù)塊的形式將數(shù)據(jù)流存儲在塊存儲中??梢詫⑴c數(shù)據(jù)流相對應的數(shù)據(jù)塊存儲在塊容器中,并且與該數(shù)據(jù)流相對應的流映射可指向該塊容器中的數(shù)據(jù)塊。多個流映射可以被存儲在流容器中,并且可以以重復數(shù)據(jù)塊不存在的方式來指向塊容器中的數(shù)據(jù)塊。在此提供了用于定位相關數(shù)據(jù)塊在這些塊容器中的存儲的技術、用于定位存儲在塊容器中的數(shù)據(jù)塊的技術、用于以可增強定位性并減少碎片整理的定位方式來將數(shù)據(jù)流存儲在塊容器中的技術、以及用于重新組織塊存儲中的已存儲數(shù)據(jù)流的技術。
文檔編號G06F12/06GK102541751SQ201110385918
公開日2012年7月4日 申請日期2011年11月17日 優(yōu)先權日2010年11月18日
發(fā)明者A·古普塔, J·R·本頓, P·A·奧爾泰安, R·卡拉赫, R·德塞, 張震河 申請人:微軟公司