專利名稱:部分去重復(fù)的文件的優(yōu)化的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及部分去重復(fù)的文件的優(yōu)化。
背景技術(shù):
數(shù)據(jù)去重復(fù)(有時(shí)也稱為數(shù)據(jù)優(yōu)化)指的是檢測(cè)、唯一地標(biāo)識(shí)以及消除存儲(chǔ)系統(tǒng)中的冗余數(shù)據(jù)從而減少需要被存儲(chǔ)在盤上或需要通過(guò)網(wǎng)絡(luò)進(jìn)行傳送的數(shù)據(jù)的物理字節(jié)量,而不會(huì)損害原始數(shù)據(jù)的保真性和完整性。通過(guò)減少存儲(chǔ)和/或傳送數(shù)據(jù)所需的資源,數(shù)據(jù)去 重復(fù)因此導(dǎo)致硬件和功率成本(用于存儲(chǔ))以及數(shù)據(jù)管理成本(例如,降低備份成本)的節(jié)約。隨著數(shù)字存儲(chǔ)的數(shù)據(jù)的數(shù)量增長(zhǎng),這些成本節(jié)約變得重要。數(shù)據(jù)去重復(fù)通常使用用于消除持久存儲(chǔ)的文件內(nèi)部及其之間的冗余性的技術(shù)的組合。一種這樣的技術(shù)用于標(biāo)識(shí)一個(gè)或多個(gè)文件中的相同數(shù)據(jù)區(qū)域,并在物理上只存儲(chǔ)一個(gè)唯一區(qū)域(塊),同時(shí)為此數(shù)據(jù)的所有重復(fù)出現(xiàn)與文件相關(guān)聯(lián)地維護(hù)對(duì)該塊的引用。另一技術(shù)是例如通過(guò)存儲(chǔ)經(jīng)壓縮的塊來(lái)將數(shù)據(jù)去重復(fù)與壓縮混合。關(guān)于數(shù)據(jù)去重復(fù)可能存在許多困難、折衷和選擇,包括在一些環(huán)境中,在給定可用時(shí)間和資源的條件下在單個(gè)操作中存在過(guò)多的數(shù)據(jù)要去重復(fù)。具體的挑戰(zhàn)存在于被部分地去重復(fù)的文件,比如響應(yīng)于新數(shù)據(jù)或?qū)ΜF(xiàn)有數(shù)據(jù)的修改而被部分召回到盤的之前被去重復(fù)的文件。對(duì)被部分去重復(fù)的文件整體進(jìn)行去重復(fù)需要大量的輸入/輸出資源以用于讀取整個(gè)文件并對(duì)其進(jìn)行分塊(chunking)并且然后將所述塊寫入到塊存儲(chǔ)中;以及CPU資源以用于執(zhí)行分塊和壓縮。
發(fā)明內(nèi)容
提供本概述以便以簡(jiǎn)化形式介紹將在以下的詳細(xì)描述中進(jìn)一步描述的一些代表性概念。本概述不旨在標(biāo)識(shí)出所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不旨在以限制所要求保護(hù)的主題的范圍的任何方式來(lái)使用。簡(jiǎn)言之,在此所描述的主題的各方面所針對(duì)的是,通過(guò)把具有一個(gè)或多個(gè)未去重復(fù)的部分的文件變換成完全去重復(fù)的文件來(lái)優(yōu)化部分去重復(fù)的文件。在一個(gè)方面,去重復(fù)機(jī)制通過(guò)如下方式對(duì)未去重復(fù)的部分執(zhí)行去重復(fù)進(jìn)程標(biāo)識(shí)出涵蓋該未去重復(fù)的部分的一個(gè)或多個(gè)塊;以及定義與所述一個(gè)或多個(gè)塊相關(guān)聯(lián)的文件偏移量之間的一個(gè)或多個(gè)新塊。與所述一個(gè)或多個(gè)新塊相關(guān)聯(lián)的塊邊界與該文件的未召回的去重復(fù)的部分的塊不重疊。通過(guò)維護(hù)與未召回的去重復(fù)的部分的對(duì)齊,所述一個(gè)或多個(gè)新塊可以被提交給塊存儲(chǔ)而不必修改任何其他塊。在另一方面,與該文件相關(guān)聯(lián)的去重復(fù)元數(shù)據(jù)被修改為包括所述塊邊界以及與所述一個(gè)或多個(gè)新塊相關(guān)聯(lián)的其他信息,并且與所述一個(gè)或多個(gè)塊相關(guān)聯(lián)的任何元數(shù)據(jù)都可以被替換。在另一方面,該文件可以被分區(qū)成子文件分區(qū)以簡(jiǎn)化去重復(fù)進(jìn)程。去重復(fù)機(jī)制在每個(gè)去重復(fù)進(jìn)程期間一次對(duì)單個(gè)子文件分區(qū)進(jìn)行分塊和提交。然后,去重復(fù)機(jī)制在對(duì)下一子文件分區(qū)進(jìn)行去重復(fù)以前從該文件中截去(truncate)該子文件分區(qū)。如果去重復(fù)進(jìn)程在完成子文件分區(qū)的去重復(fù)以前被暫停,則去重復(fù)進(jìn)程可以在已被提交的最后一個(gè)塊之后的位置處恢復(fù)。
作為示例而非限制,在附圖中示出了本發(fā)明,附圖中相同的附圖標(biāo)記指示相同或相似的元素,附圖中圖I是示出根據(jù)一個(gè)示例性實(shí)施方式的用于優(yōu)化被部分去重復(fù)的文件的示例系統(tǒng)的框示。圖2是表示根據(jù)一個(gè)示例性實(shí)施方式的去重復(fù)機(jī)制的示例性組件/階段的框圖。
圖3A—圖4B示出了根據(jù)一個(gè)示例性實(shí)施方式被變換成完全去重復(fù)文件的各種示例性部分召回的文件。圖3C示出了根據(jù)一個(gè)示例性實(shí)施方式被變換成完全去重復(fù)文件的示例性部分去重復(fù)文件。圖4A —圖4B示出了根據(jù)一個(gè)示例性實(shí)施方式的去重復(fù)元數(shù)據(jù)。圖5是示出了根據(jù)一個(gè)示例性實(shí)施方式用于將具有至少一個(gè)未去重復(fù)部分的文件變換成完全去重復(fù)的文件的步驟的流程圖。圖6是示出了根據(jù)一個(gè)示例性實(shí)施方式用于對(duì)被分區(qū)成子文件分區(qū)的文件進(jìn)行去重復(fù)的步驟的流程圖。圖7是表示其中可實(shí)現(xiàn)此處描述的各種實(shí)施例的示例性非限制聯(lián)網(wǎng)環(huán)境的框圖。圖8是表示其中可實(shí)現(xiàn)此處所描述的各種實(shí)施例的一個(gè)或多個(gè)方面的示例性非限制計(jì)算系統(tǒng)或操作環(huán)境的框圖。
具體實(shí)施例方式在此所描述的技術(shù)的各方面總體上所針對(duì)的是,通過(guò)把具有一個(gè)或多個(gè)未去重復(fù)的部分的文件變換成完全去重復(fù)的文件來(lái)優(yōu)化部分去重復(fù)的文件。在一個(gè)示例性實(shí)施方式中,部分去重復(fù)的文件可以包括部分召回的文件,該部分召回的文件通過(guò)如下方式被優(yōu)化對(duì)所召回的文件范圍而不是整個(gè)文件進(jìn)行去重復(fù);以及把與之前被去重復(fù)的部分相關(guān)聯(lián)的去重復(fù)元數(shù)據(jù)同新的被去重復(fù)的文件范圍相組合。由于之前被去重復(fù)的部分未再次被去重復(fù),因此節(jié)省了顯著的I/O和CPU資源量。類似地,被部分去重復(fù)的文件內(nèi)的一部分可以被去重復(fù),使得該部分內(nèi)的新塊與周圍的之前被去重復(fù)的部分的塊對(duì)齊。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制以如下方式分階段地優(yōu)化大文件將該文件分區(qū)成子文件分區(qū);將每個(gè)子文件分區(qū)內(nèi)的塊提交給塊存儲(chǔ);以及從包含該文件的文件流中截去該子文件分區(qū)。這樣的實(shí)施方式在優(yōu)化整個(gè)文件以前釋放了存儲(chǔ)空間,并且降低了在該文件被完全去重復(fù)之前存在崩潰或異常中止的情況下發(fā)生存儲(chǔ)器泄漏的可能性。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制支持暫停指令,該暫停指令掛起去重復(fù)進(jìn)程直到隨后的恢復(fù)指令。去重復(fù)機(jī)制在第一未去重復(fù)的部分處重啟去重復(fù)進(jìn)程,其中該第一未去重復(fù)的部分是未被分塊和提交給塊存儲(chǔ)的最后一個(gè)部分。這允許主系統(tǒng)在另一工作量需要系統(tǒng)資源的情況下暫停去重復(fù)進(jìn)程,而不必對(duì)已經(jīng)去重復(fù)的數(shù)據(jù)重復(fù)去重復(fù)進(jìn)程。在又一示例性實(shí)施方式中,通過(guò)對(duì)塊和相應(yīng)文件范圍進(jìn)行多級(jí)分區(qū)來(lái)實(shí)現(xiàn)對(duì)大文件的快速輸入/輸出。由于包括大文件范圍集合的去重復(fù)元數(shù)據(jù)變得難以搜索,因此將文件分區(qū)成多個(gè)連續(xù)的較小子文件分區(qū)(所述子文件分區(qū)再次被分區(qū))允許去重復(fù)機(jī)制高效地將虛擬文件偏移量(相對(duì)于文件的開頭)轉(zhuǎn)換成這些子文件分區(qū)內(nèi)的特定塊偏移量。文件偏移量轉(zhuǎn)換可以在對(duì)文件的輸入/輸出(I/o)活動(dòng)(即讀取/寫入)期間執(zhí)行??梢栽趯?duì)I/O活動(dòng)的影響有限的情況下實(shí)現(xiàn)該轉(zhuǎn)換的充分性能。圖I是示出根據(jù)一個(gè)示例性實(shí)施方式的用于優(yōu)化被部分去重復(fù)的文件的示例系統(tǒng)的框示。該示例性系統(tǒng)可以支持用于將諸如文件102之類的被部分去重復(fù)的文件變換成完全去重復(fù)文件的各種去重復(fù)或優(yōu)化機(jī)制。在一個(gè)示例性實(shí)施方式中,文件102包括未去重復(fù)的數(shù)據(jù)104和去重復(fù)的部分(即塊)的組合。未去重復(fù)的數(shù)據(jù)104包括部分召回的數(shù)據(jù)和/或仍須去重復(fù)的數(shù)據(jù)。例如,應(yīng)用114可以修改部分召回的 數(shù)據(jù)和/或向文件102添加新數(shù)據(jù)。一般而言,當(dāng)文件被完全去重復(fù)時(shí),該文件與元數(shù)據(jù)106相關(guān)聯(lián),該元數(shù)據(jù)106包括將該文件在塊存儲(chǔ)110中的塊(例如,C3、C6和C7)映射回該文件的邏輯表示的去重復(fù)(去重)元數(shù)據(jù)108。如果文件102在去重復(fù)進(jìn)程期間被分區(qū)成子文件分區(qū),則文件102還包括分區(qū)表118,所述分區(qū)為每個(gè)子文件區(qū)分維護(hù)文件偏移量、并且為子文件分區(qū)內(nèi)的任何分區(qū)維護(hù)文件偏移量。如在此所述,分區(qū)表118可以包括與子文件分區(qū)相對(duì)應(yīng)的文件范圍的分層結(jié)構(gòu)。塊存儲(chǔ)元數(shù)據(jù)112包括散列索引以保證塊存儲(chǔ)110不存儲(chǔ)重復(fù)的塊。一般而言,當(dāng)應(yīng)用114修改現(xiàn)有數(shù)據(jù)或者向文件寫入新數(shù)據(jù)時(shí),(例如在文件系統(tǒng)過(guò)濾器中實(shí)現(xiàn)的)去重復(fù)機(jī)制116訪問(wèn)塊存儲(chǔ)110中的一個(gè)或多個(gè)所引用的塊,酌情在任何解壓縮以后作為所召回的文件數(shù)據(jù)返回所述一個(gè)或多個(gè)所引用的塊,并且將所召回的文件數(shù)據(jù)存儲(chǔ)在未去重復(fù)的數(shù)據(jù)104中。存在致使文件102從處于完全去重復(fù)狀態(tài)變?yōu)槲慈ブ貜?fù)/部分去重復(fù)狀態(tài)的各種操作。這包括用戶或進(jìn)程向文件寫入,使得位于寫入文件偏移量位置處的經(jīng)修改的文件數(shù)據(jù)不再與先前包含該數(shù)據(jù)的塊相匹配。完全召回整個(gè)文件以支持這樣的文件修改常常是低效的(例如對(duì)于非常大的文件的小修改而言)。僅僅召回相關(guān)塊使文件102處于部分去重復(fù)狀態(tài),在該狀態(tài)下,文件102包括某些所召回的文件數(shù)據(jù)、以及對(duì)還未被召回的塊的引用。例如,在圖I中考慮應(yīng)用114僅僅召回塊C7并且將其寫入到其相應(yīng)數(shù)據(jù)。文件102把所召回的塊數(shù)據(jù)包含在被寫入操作修改的未去重復(fù)的數(shù)據(jù)104中。去重復(fù)元數(shù)據(jù)108被更新以反映該部分召回狀態(tài),以便得知文件102包含了所召回的數(shù)據(jù)以及不再映射到現(xiàn)在過(guò)期的塊C7。在一個(gè)示例性實(shí)施方式中,去重復(fù)元數(shù)據(jù)108跟蹤文件102的哪個(gè)或哪些部分已經(jīng)被召回、以及哪些部分作為去重復(fù)的塊保留在塊存儲(chǔ)110中。文件因此可存在于非去重復(fù)狀態(tài)、部分去重復(fù)(部分召回)狀態(tài)或完全去重復(fù)(即,優(yōu)化)狀態(tài)中。文件可以在各種場(chǎng)景中處于部分去重復(fù)狀態(tài)。例如,用戶可能已經(jīng)在適當(dāng)位置處修改了某些文件范圍。去重復(fù)機(jī)制116還可以召回更多數(shù)據(jù)以使用戶寫入與塊邊界、稀疏文件邊界(在一個(gè)實(shí)施方式中是各自為六十四(64)KB的固定塊)、或任何其他邊界對(duì)齊。作為另一示例,去重復(fù)機(jī)制116優(yōu)化子文件分區(qū),截去相關(guān)聯(lián)的文件范圍并且要么由于暫停指令、要么因?yàn)橄到y(tǒng)崩潰而必須在去重復(fù)進(jìn)程期間停止。在又一示例中,去重復(fù)機(jī)制116對(duì)文件的之前版本進(jìn)行去重復(fù),然后用戶用新數(shù)據(jù)來(lái)擴(kuò)展該文件。在一個(gè)實(shí)施方式中,去重復(fù)機(jī)制116執(zhí)行各種跟蹤操作,包括在去重復(fù)元數(shù)據(jù)108中維護(hù)關(guān)于文件的哪些部分已經(jīng)被召回以及哪些部分被保留在塊存儲(chǔ)110中的跟蹤數(shù)據(jù)。在一個(gè)示例性實(shí)施方式中,根據(jù)Microsoft NTFS配置,跟蹤數(shù)據(jù)被維護(hù)在NTFS重解析點(diǎn)中,NTFS重解析點(diǎn)還用于向去重復(fù)機(jī)制116通知文件被部分去重復(fù)。在其它使用場(chǎng)景中,解析點(diǎn)是公知的且不在此處詳細(xì)描述。注意到,重解析點(diǎn)僅是一個(gè)備選;可為跟蹤目的替換地使用其它元數(shù)據(jù)/流。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116根據(jù)去重復(fù)策略120執(zhí)行去重復(fù)進(jìn)程。這樣的策略包括用于確定對(duì)文件102何時(shí)啟動(dòng)、停止和/或恢復(fù)去重復(fù)進(jìn)程的各種標(biāo) 準(zhǔn)。例如,去重復(fù)機(jī)制116可以在對(duì)文件102的修改之后流逝了某段時(shí)間時(shí)或者在主機(jī)變?yōu)榭臻e時(shí)啟動(dòng)去重復(fù)進(jìn)程。作為另一示例,去重復(fù)機(jī)制116可以在新塊超過(guò)某個(gè)大小時(shí)或者在主機(jī)變?yōu)榉强臻e或者需要關(guān)閉時(shí)停止去重復(fù)進(jìn)程并提交新塊。作為又一示例,去重復(fù)機(jī)制116可以在完成對(duì)未去重復(fù)的數(shù)據(jù)104的分塊以后或者在完成對(duì)子文件分區(qū)之一的分塊以后將新塊提交給塊存儲(chǔ)112。圖2是表示根據(jù)一個(gè)示例性實(shí)施方式的去重復(fù)機(jī)制116的示例性組件的框圖。在該示例性實(shí)施方式中,示例性組件在對(duì)文件202執(zhí)行去重復(fù)進(jìn)程期間作為順序階段操作。如在此所述,去重復(fù)進(jìn)程將部分去重復(fù)的文件或未去重復(fù)的文件變換成完全去重復(fù)的文件。這包括標(biāo)識(shí)階段204,該階段掃描文件202并且確定哪些文件被部分去重復(fù)。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116檢查各個(gè)去重復(fù)元數(shù)據(jù)并且檢測(cè)處于部分召回狀態(tài)的文件。去重復(fù)元數(shù)據(jù)可以包括重解析指向一個(gè)或多個(gè)流圖的數(shù)據(jù)。如果塊存儲(chǔ)中的塊的組合大小小于文件大小或者文件范圍位圖指示一個(gè)或多個(gè)未去重復(fù)部分,則該文件處于部分去重復(fù)狀態(tài)。然后,去重復(fù)機(jī)制116檢索定義文件范圍的流圖以獲得被去重復(fù)的部分以及未去重復(fù)的部分。每個(gè)部分都可以對(duì)應(yīng)于起始文件偏移量和大小,根據(jù)所述起始偏移量和大小,去重復(fù)機(jī)制116計(jì)算出結(jié)束文件偏移量。文件范圍不重疊,并且從開始到結(jié)尾覆蓋整個(gè)文件。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116標(biāo)識(shí)出涵蓋未去重復(fù)的部分的文件范圍的塊。例如,應(yīng)用可能已經(jīng)召回了這些塊并且修改了一個(gè)或多個(gè)各個(gè)部分以將該文件置于部分召回狀態(tài)。對(duì)齊階段206修改與這些塊相關(guān)聯(lián)的塊邊界以防止這些新塊和與被去重復(fù)的部分相關(guān)聯(lián)的塊邊界重疊。如在此所解釋的那樣,對(duì)齊階段206還引導(dǎo)分塊組件在特定文件偏移量處開始分塊階段208并且在另一文件偏移量處終止分塊階段208。在分塊階段208期間,可以根據(jù)試探法來(lái)選擇諸如ChA1-ChAm之類的分塊算法,所述試探法可以涉及諸如文件擴(kuò)展名、頭信息等等之類的屬性。例如,可為一個(gè)文件選擇通用分塊算法,而另一文件可具有專用于其文件擴(kuò)展名的分塊算法(諸如用于ZIP部分的分塊算法)。還可以基于來(lái)自標(biāo)識(shí)階段204的提示或者基于內(nèi)部反饋220或外部反饋222來(lái)選擇分塊算法。分塊階段208 (其在給定實(shí)施方式需要時(shí)可以包括或遵循文件解壓縮)根據(jù)所選擇的算法將文件內(nèi)容分解成塊,其中所述算法可以增加每個(gè)文件的內(nèi)容在另一文件中重復(fù)的概率,然后這些塊可以在之后被壓縮??赏ㄟ^(guò)如下方式來(lái)執(zhí)行分塊根據(jù)文件的結(jié)構(gòu)、內(nèi)容驅(qū)動(dòng)的算法(例如將媒體文件劃分成媒體頭和媒體正文,該媒體正文進(jìn)而可被分層地拆分成一系列部分);或者使用基于在滑動(dòng)窗上重復(fù)計(jì)算的快速散列化技術(shù)(這樣的快速散列函數(shù)包括CRC和Rabin函數(shù)族)來(lái)對(duì)文件內(nèi)容分塊的算法,其中塊是在散列函數(shù)和當(dāng)前塊大小/內(nèi)容滿足特定標(biāo)準(zhǔn)時(shí)被選擇的。分塊階段208的結(jié)果包括(每文件的)塊列表232,所述塊是使用一組“塊記錄”來(lái)傳遞的,這些塊記錄中的每個(gè)都包含描述塊中的數(shù)據(jù)類型的相關(guān)聯(lián)元數(shù)據(jù)。這樣的元數(shù)據(jù)的一個(gè)示例是作為分塊算法的執(zhí)行的一部分來(lái)計(jì)算的任何滾動(dòng)散列。另一示例是塊內(nèi)的實(shí)際數(shù)據(jù)的壓縮級(jí)別的指示符(例如ZIP分塊模塊將指示壓縮選擇器模塊不壓縮可能已被壓縮的塊)。注意對(duì)于所托管的進(jìn)程執(zhí)行,塊被插入到恰當(dāng)?shù)摹拜敵鲫?duì)列”以用于處理,并在然后被批量地發(fā)送給去重復(fù)進(jìn)程。
可批量處理的塊被下一階段、即去重復(fù)檢測(cè)階段210消費(fèi),該去重復(fù)檢測(cè)階段210通過(guò)散列唯一地標(biāo)識(shí)每個(gè)塊,然后將該散列用于去重復(fù)檢測(cè)。在分塊之后,去重復(fù)檢測(cè)階段210確定塊存儲(chǔ)中是否已存在所述塊。計(jì)算出針對(duì)塊計(jì)算的強(qiáng)散列以在散列索引服務(wù)中調(diào)用查找操作。散列索引服務(wù)對(duì)已為去重復(fù)系統(tǒng)所知或已被存儲(chǔ)在塊存儲(chǔ)218內(nèi)的唯一塊中的一些或全部的散列進(jìn)行索引化。塊存儲(chǔ)模塊218維護(hù)實(shí)際塊的持久數(shù)據(jù)庫(kù)。分塊階段208支持將新塊插入到塊存儲(chǔ)218 (如果還不存在這樣的塊)中;將引用數(shù)據(jù)添加到塊存儲(chǔ)中的現(xiàn)有塊(在檢測(cè)到先前持久存儲(chǔ)的塊以后);以及提交一組塊插入和/或塊引用添加。塊存儲(chǔ)218還可實(shí)現(xiàn)各種后臺(tái)/維護(hù)作業(yè),包括垃圾收集、數(shù)據(jù)/元數(shù)據(jù)檢查等等。元數(shù)據(jù)創(chuàng)建階段212生成去重復(fù)元數(shù)據(jù)和塊存儲(chǔ)元數(shù)據(jù),以考慮到已經(jīng)被分塊階段208定義的新塊。在維護(hù)每文件的塊存儲(chǔ)元數(shù)據(jù)(比如流圖)的示例性實(shí)施例中,去重復(fù)機(jī)制116通過(guò)將原始?jí)K存儲(chǔ)元數(shù)據(jù)和新塊元數(shù)據(jù)相組合來(lái)重構(gòu)這樣的元數(shù)據(jù)。另外,元數(shù)據(jù)創(chuàng)建階段212更新去重復(fù)元數(shù)據(jù)以映射到與新塊相關(guān)聯(lián)的塊存儲(chǔ)元數(shù)據(jù)。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116保留來(lái)自舊的流圖的未改變的塊定義,并且將這些定義添加到新的流圖。對(duì)于與對(duì)齊的未去重復(fù)部分相對(duì)應(yīng)的新塊,去重復(fù)機(jī)制116將相應(yīng)定義添加到新流圖并且隨后跳過(guò)舊的流圖的任何過(guò)時(shí)的定義?;旧?,新的流圖是通過(guò)縫合舊的流圖和新塊元數(shù)據(jù)而創(chuàng)建的。去重復(fù)機(jī)制116將新的流圖添加到塊存儲(chǔ)元數(shù)據(jù)并且刪除舊的流圖?;蛘?,去重復(fù)機(jī)制116用新塊元數(shù)據(jù)更新舊的流圖而不是創(chuàng)建新的流圖并刪除舊的流圖。在另一示例性實(shí)施方式中,去重復(fù)元數(shù)據(jù)可以包括分區(qū)表,該分區(qū)表包括與塊和子文件分區(qū)相關(guān)聯(lián)的文件范圍的分層結(jié)構(gòu)。該分層結(jié)構(gòu)可以直接映射到一組子文件分區(qū)。一個(gè)示例包括指向一組二級(jí)流圖的頂級(jí)流圖。另一示例包括流圖的多級(jí)組織。另一示例包括使用預(yù)定義的、固定大小的子文件分區(qū),這通過(guò)將文件偏移量除以固定的子文件分區(qū)大小來(lái)實(shí)現(xiàn)文件偏移量到特定子文件分區(qū)的轉(zhuǎn)換,而無(wú)需咨詢頂級(jí)流圖。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制116將引用計(jì)數(shù)、而不是流圖用作元數(shù)據(jù)的一部分。去重復(fù)機(jī)制116針對(duì)不再被給定文件引用的任何塊遞減引用計(jì)數(shù),并且針對(duì)與對(duì)齊的未去重復(fù)部分相對(duì)應(yīng)的任何新近引用的塊遞增引用計(jì)數(shù)。如在此所述,當(dāng)在同一去重復(fù)進(jìn)程中從一個(gè)階段轉(zhuǎn)移到另一階段時(shí),去重復(fù)機(jī)制116可以將新塊定義添加到原始流圖,而不是創(chuàng)建新的流圖。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116將新塊定義追加到該文件的原始流圖。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制116將原始流圖分割成一系列部分流圖,其中每個(gè)部分流圖都對(duì)應(yīng)于在提交階段216期間被處理的子文件分區(qū)。如果去重復(fù)進(jìn)程在優(yōu)化子文件分區(qū)時(shí)處理暫停指令,則去重復(fù)機(jī)制116創(chuàng)建新的流圖,所述新的流圖包括新塊元數(shù)據(jù)以及與去重復(fù)的部分相關(guān)聯(lián)的定義。當(dāng)分塊階段208恢復(fù)對(duì)未去重復(fù)部分的分塊時(shí),新的流圖取代原始流圖。在提交階段216期間,重解析數(shù)據(jù)現(xiàn)在引用新的流圖,這允許原始流圖被回收。如果文件處于部分召回狀態(tài)并且去重復(fù)進(jìn)程被暫停,則在恢復(fù)指令以后創(chuàng)建的新的流圖不取代原始流圖。在一個(gè)示例性實(shí)施方式中,部分召回的文件引用兩個(gè)流圖。在另一示例性實(shí)施方式中,部分召回的文件繼續(xù)僅僅引用舊的流圖。去重復(fù)機(jī)制116在 提交階段216期間避免文件截去。當(dāng)最后一個(gè)子文件分區(qū)被去重復(fù)時(shí),新的流圖取代原始流圖。在將新塊添加到塊存儲(chǔ)218以前,可以參照壓縮階段214處理這些新塊。壓縮算法選擇器處理文件和塊元數(shù)據(jù),并且可以嘗試確定對(duì)于此類型數(shù)據(jù),哪個(gè)壓縮算法CA1-CAn(若有的話)工作得最好。在執(zhí)行任何壓縮以后,運(yùn)行時(shí)可以驗(yàn)證是否進(jìn)行了任何顯著的節(jié)省。例如,如果經(jīng)壓縮的塊大于其未經(jīng)壓縮的形式,則新塊以未經(jīng)壓縮的形式存儲(chǔ)(或者可以利用不同算法再次嘗試壓縮)。壓縮算法可基于策略、文件類型等等來(lái)選擇。提交階段216用指向塊存儲(chǔ)218內(nèi)的已去重復(fù)數(shù)據(jù)的引用來(lái)替代每個(gè)文件。為此目的,去重復(fù)機(jī)制116接收其塊已被插入到塊存儲(chǔ)中的文件的列表。在一個(gè)實(shí)現(xiàn)中,每個(gè)塊列表都被封裝到塊ID流(由唯一的流ID來(lái)標(biāo)識(shí))中,其被持久保存到與文件相關(guān)聯(lián)的重解析點(diǎn)。在提交階段216期間,去重復(fù)機(jī)制116用諸如重解析點(diǎn)之類的跟蹤數(shù)據(jù)來(lái)替代該文件,所述跟蹤數(shù)據(jù)包含該ID和塊流ID的定位器,也就是說(shuō),包含流圖的塊,包括用于組裝當(dāng)前文件以及它們的邏輯偏移量的塊的列表。圖3A —圖3C示出了包括至少一個(gè)未去重復(fù)的部分的各個(gè)示例文件,所述未去重復(fù)的部分根據(jù)一些示例性實(shí)施方式被變換成完全去重復(fù)的文件。圖3A示出了具有如下塊的部分召回的文件所述塊在文件偏移量302處開始、在文件偏移量304處結(jié)束,并且包括在文件偏移量308處開始的未去重復(fù)的部分306。每個(gè)塊都為六十四(64)KB的相同大小,但是其他塊大小處于本公開的范圍內(nèi)。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116在文件偏移量302處開始分塊階段。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制116在文件偏移量308處開始分塊階段,該分塊階段定義了小于六十四(64)KB的新塊310。去重復(fù)機(jī)制116將新塊的塊邊界修改為與同之前去重復(fù)的部分相關(guān)聯(lián)的塊邊界對(duì)齊。圖3B示出了具有如下塊的部分召回的文件所述塊在文件偏移量312處開始、在文件偏移量312處結(jié)束,并且包括在文件偏移量318處結(jié)束的未去重復(fù)的部分316。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116在文件偏移量318處終止分塊階段,該分塊階段定義了小于六十四(64)KB的新塊316。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制116在文件偏移量314處終止分塊階段,使得新塊與同隨后的去重復(fù)的部分相關(guān)聯(lián)的塊邊界對(duì)齊。根據(jù)另一實(shí)施方式,去重復(fù)機(jī)制116可以繼續(xù)超出文件偏移量314的分塊階段,直到與具有隨后的去重復(fù)的部分的塊對(duì)齊。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制116繼續(xù)超出文件偏移量314的分塊階段,但是使用閾值來(lái)確定何時(shí)終止分塊階段。如果在該閾值內(nèi)未實(shí)現(xiàn)與具有隨后的去重復(fù)部分的塊對(duì)齊,則去重復(fù)機(jī)制116定義類似于塊320的新塊,所述新塊小于六十四(64) KB并且導(dǎo)致所需的對(duì)齊。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制基于固定的塊大小(例如六十四(KB)至一百二十八(128) KB)或者塊的總數(shù)來(lái)計(jì)算該閾值。圖3C示出了部分去重復(fù)的文件,該文件被分區(qū)成子文件分區(qū)322、子文件分區(qū)324和子文件分區(qū)326。去重復(fù)元數(shù)據(jù)為這些子文件分區(qū)維護(hù)文件偏移量。分階段地對(duì)部分去重復(fù)的文件執(zhí)行去重復(fù),其中每個(gè)子文件分區(qū)都在單獨(dú)的階段被分塊并且提交給塊存儲(chǔ)。然后,去重復(fù)機(jī)制更新去重復(fù)元數(shù)據(jù)并且截去部分去重復(fù)的文件以避免保留特定子文件分區(qū)的兩個(gè)副本。在每個(gè)階段以后,未去重復(fù)的部分的大小減小。當(dāng)最后一個(gè)子文件分區(qū)被提交時(shí),部分去重復(fù)的文件被變換成完全去重復(fù)的文件。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116在對(duì)子文件分區(qū)322去重復(fù) 時(shí)處理暫停指令,并且在文件偏移量328處停止去重復(fù)進(jìn)程。當(dāng)接收到恢復(fù)指令時(shí),去重復(fù)機(jī)制116在文件偏移量328處重啟去重復(fù)進(jìn)程。在將形成子文件分區(qū)322的塊提交給塊存儲(chǔ)并且更新元數(shù)據(jù)以后,去重復(fù)機(jī)制116刪除子文件分區(qū)322并且繼續(xù)對(duì)子文件分區(qū)324去重復(fù)。如在此所述那樣,一旦子文件分區(qū)324被去重復(fù),則去重復(fù)進(jìn)程就終止,因?yàn)椴辉俅嬖谑S嗟奈慈ブ貜?fù)的部分。圖4A—圖4B示出了根據(jù)一個(gè)示例性實(shí)施方式的去重復(fù)元數(shù)據(jù)。在圖4A中所表示的一個(gè)示例性實(shí)施方式中,去重復(fù)元數(shù)據(jù)包括文件402和文件404。文件402包括引用流圖408的跟蹤數(shù)據(jù)406。類似地,文件404包括引用流圖412的跟蹤數(shù)據(jù)410。兩個(gè)流圖都對(duì)應(yīng)于塊存儲(chǔ)414內(nèi)的塊。如所示那樣,流圖408定義形成文件402的塊C2 — C4和塊C6。類似地,流圖412定義形成文件404的塊Cl 一 C5。如果諸如塊C5之類的特定塊被召回并且一部分隨后被應(yīng)用修改(未去重復(fù)),從而致使文件404變?yōu)椴糠秩ブ貜?fù)的文件,則去重復(fù)機(jī)制116定義涵蓋塊C5的一個(gè)或多個(gè)新塊。然后,去重復(fù)機(jī)制116更新流圖412或者創(chuàng)建新流圖以替換流圖412。在兩個(gè)實(shí)施方式任一中,去重復(fù)元數(shù)據(jù)現(xiàn)在映射到一個(gè)或多個(gè)新塊而不是塊C5。例如,如果去重復(fù)機(jī)制116創(chuàng)建與塊C6匹配的新塊,則更新后的或新的流圖包括映射到塊存儲(chǔ)414中的塊C6的新定義。在圖4B中大體上示出的一個(gè)實(shí)施方式中,NTFS重解析點(diǎn)440包括用于引用流圖的指針442、以及用于跟蹤具有未去重復(fù)部分的塊的位圖結(jié)構(gòu)444。重解析點(diǎn)440可以是跟蹤數(shù)據(jù)406或跟蹤數(shù)據(jù)410的體現(xiàn)。更具體而言,為了部分召回文件,去重復(fù)機(jī)制116創(chuàng)建文件的虛擬視圖,其中分塊階段在預(yù)定邊界處(比如在64K邊界處)執(zhí)行。去重復(fù)機(jī)制116在重解析點(diǎn)440中的位圖結(jié)構(gòu)444中維護(hù)該視圖,其中在一個(gè)實(shí)施方式中,位圖結(jié)構(gòu)444中的經(jīng)置位的位指示塊已經(jīng)被召回到去重復(fù)的文件,而O位指示該塊駐留在塊存儲(chǔ)中。在設(shè)置重解析點(diǎn)440時(shí),可添加塊的大小。注意,數(shù)據(jù)在一個(gè)時(shí)間被召回,而位圖結(jié)構(gòu)444在另一時(shí)間更新,這導(dǎo)致可能的與崩潰相關(guān)的不一致性。如此處所述的,當(dāng)將數(shù)據(jù)提交(例如轉(zhuǎn)儲(chǔ)清除)到穩(wěn)定存儲(chǔ)(例如,盤等)時(shí),對(duì)操作的排序使得系統(tǒng)為崩潰一致的。更具體而言,位圖結(jié)構(gòu)444的改變僅在它所表示的相應(yīng)數(shù)據(jù)被轉(zhuǎn)儲(chǔ)清除到盤之后才被轉(zhuǎn)儲(chǔ)清除到盤上。以此方式,直到數(shù)據(jù)已知被安全地轉(zhuǎn)儲(chǔ)清除到盤上,位圖結(jié)構(gòu)444才指示該數(shù)據(jù)已經(jīng)被部分召回。注意,如果盤和文件系統(tǒng)支持通寫(write-through),則可以替代于轉(zhuǎn)儲(chǔ)清除而使用通寫。注意,盡管通常使用將文件數(shù)據(jù)/元數(shù)據(jù)轉(zhuǎn)儲(chǔ)清除到盤作為此處的示例,但這僅是示例。因此,“提交到穩(wěn)定存儲(chǔ)”還包括文件系統(tǒng)和存儲(chǔ)介質(zhì)通寫的概念、以及使用文件系統(tǒng)和存儲(chǔ)介質(zhì)轉(zhuǎn)儲(chǔ)清除的概念、或者用于保證安全地將數(shù)據(jù)寫入到穩(wěn)定存儲(chǔ)的任何其他手段。在一個(gè)示例性實(shí)施方式中,可使用位圖結(jié)構(gòu)444來(lái)高效地將部分召回的文件轉(zhuǎn)回完全去重復(fù)的文件。為此目的,當(dāng)掃描文件以進(jìn)行去重復(fù)時(shí),可使用跟蹤數(shù)據(jù),使得向去重復(fù)機(jī)制116僅僅提供部分召回的文件范圍(即未去重復(fù)的部分)以用于去重復(fù)。當(dāng)包括這些部分召回的文件范圍的新塊被添加到塊存儲(chǔ)時(shí),包括重解析點(diǎn)440的去重復(fù)元數(shù)據(jù)被調(diào)整為反映部分召回的文件范圍現(xiàn)在是經(jīng)優(yōu)化的塊并且不再是部分召回的范圍。圖5是示出了根據(jù)一個(gè)示例性實(shí)施方式用于將具有至少一個(gè) 未去重復(fù)部分的文件變換成完全去重復(fù)的文件的步驟的流程圖。圖5所示的步驟始于步驟502,并且前進(jìn)到步驟504,在該步驟,去重復(fù)機(jī)制116標(biāo)識(shí)出部分召回的文件,該文件被分區(qū)成塊。步驟506示出了使用與該文件相關(guān)聯(lián)的元數(shù)據(jù)(比如去重復(fù)元數(shù)據(jù)和塊存儲(chǔ)元數(shù)據(jù))來(lái)標(biāo)識(shí)出一個(gè)或多個(gè)未去重復(fù)的部分。如在此所述,根據(jù)一個(gè)或多個(gè)示例性實(shí)施方式,去重復(fù)機(jī)制116可以檢查重解析點(diǎn)內(nèi)的召回位圖,并且確定召回文件范圍以及涵蓋這些文件范圍的塊的位置。步驟508表示關(guān)于是否消除任何去重復(fù)的部分的塊邊界的判定。在一個(gè)示例性實(shí)施方式中,由于未去重復(fù)的部分需要與包括去重復(fù)部分的塊的塊邊界對(duì)齊,因此兩個(gè)未去重復(fù)部分之間的小的去重復(fù)部分導(dǎo)致要在分塊階段期間定義小塊。如果部分召回的文件包括小的去重復(fù)的部分,則圖5中所述的方法前進(jìn)到步驟510。另一方面,如果不存在要消除的去重復(fù)部分,則圖5中所述的方法前進(jìn)到步驟512。步驟510針對(duì)將兩個(gè)或更多未去重復(fù)的部分組合成一個(gè)未去重復(fù)的部分,該未去重復(fù)的部分作為召回?cái)?shù)據(jù)的單個(gè)文件范圍被去重復(fù),這可能需要從塊存儲(chǔ)讀取塊以填充未去重復(fù)的部分之間的空隙。在執(zhí)行步驟510之后,圖5中所述的步驟繼續(xù)到步驟512。步驟512針對(duì)確定檢查未去重復(fù)的部分。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116標(biāo)識(shí)出包括或涵蓋未去重復(fù)的部分的塊。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116標(biāo)識(shí)出該文件內(nèi)的第一或最早的未去重復(fù)部分,并且定義與至少一個(gè)去重復(fù)部分內(nèi)的周圍塊的塊邊界對(duì)齊的新塊。步驟514表示至少一個(gè)如下的塊的定義所述塊在先于或等于與未去重復(fù)部分相關(guān)聯(lián)的起始文件偏移量的一文件偏移量處開始,并且在后繼于或等于與未去重復(fù)部分相關(guān)聯(lián)的結(jié)束文件偏移量的一文件偏移量處終止。步驟516針對(duì)關(guān)于是否對(duì)部分召回文件的下一未去重復(fù)部分進(jìn)行去重復(fù)的判定。如果不再存在未去重復(fù)的部分,則圖5中所述的方法前進(jìn)到步驟518。另一方面,如果存在附加的未去重復(fù)部分,則圖5中所述的方法返回到步驟512。步驟518示出了與部分召回文件的至少一個(gè)去重復(fù)部分的文件偏移量對(duì)齊的塊邊界的確定。在一個(gè)示例性實(shí)施方式中,所述至少一個(gè)塊中的最后一個(gè)塊具有與所述至少一個(gè)去重復(fù)部分的后繼塊的塊邊界不重疊的塊邊界。類似地,所述至少一個(gè)塊中的第一塊具有與所述至少一個(gè)去重復(fù)部分的之前塊的塊邊界不重疊的塊邊界。步驟520涉及為至少一個(gè)塊創(chuàng)建元數(shù)據(jù)并且將所述至少一個(gè)塊提交給塊存儲(chǔ)。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116創(chuàng)建部分召回文件的文件偏移量與所述至少一個(gè)塊的塊邊界之間的映射。然后,去重復(fù)機(jī)制116將這些映射與所述至少一個(gè)去重復(fù)部分的塊邊界相組合,并且創(chuàng)建塊存儲(chǔ)元數(shù)據(jù),所述塊存儲(chǔ)元數(shù)據(jù)替換該文件的之前的塊存儲(chǔ)元數(shù)據(jù)。在替換實(shí)施方式中,去重復(fù)機(jī)制116使用這些映射更新去重復(fù)元數(shù)據(jù)(例如重解析點(diǎn)、流id和/或位圖等等)和塊存儲(chǔ)元數(shù)據(jù)(例如流圖)。在存儲(chǔ)所述至少一個(gè)塊以前,去重復(fù)機(jī)制116檢查與塊存儲(chǔ)相關(guān)聯(lián)的散列索引以確定所述塊中是否有任何塊已經(jīng)存儲(chǔ)在該塊存儲(chǔ)中。在另一替換的實(shí)施方式中,去重復(fù)機(jī)制116在對(duì)下一去重復(fù)部分分塊之前執(zhí)行步驟518和步驟520。例如,在執(zhí)行步驟516以前,去重復(fù)機(jī)制116中止去重復(fù)進(jìn)程,用塊邊界更新塊存儲(chǔ)元數(shù)據(jù),將所述至少一個(gè)塊提交給塊存儲(chǔ),并且通過(guò)刪除未去重復(fù)的部分來(lái)截去部分召回的文件。去重復(fù)機(jī)制116可以如圖6所示響應(yīng)于暫停指令而中止去重復(fù)進(jìn)程。在又一替換的實(shí)施方式中,去重復(fù)機(jī)制116基于去重復(fù)策略中止去重復(fù)進(jìn)程。作為示例,去重復(fù)機(jī)制116在標(biāo)識(shí)出下一未去重復(fù)部分以及定義具有這樣的部分的至少一個(gè)塊之前使用各種標(biāo)準(zhǔn)來(lái)提交與未去重復(fù)部分相關(guān)聯(lián)的至少一個(gè)塊。
步驟522針對(duì)從塊存儲(chǔ)中刪除未被引用的塊。例如,這些塊不再與包括部分召回文件在內(nèi)的任何文件的流圖相關(guān)聯(lián)。對(duì)于采用引用計(jì)數(shù)的實(shí)施方式,去重復(fù)機(jī)制針對(duì)所述至少一個(gè)塊遞減引用計(jì)數(shù)。如果任何所得到的引用計(jì)數(shù)等于0,則每個(gè)相對(duì)應(yīng)的塊都被回收和刪除。步驟524終止圖5所描述的方法的步驟。圖6是示出了根據(jù)一個(gè)示例性實(shí)施方式用于對(duì)被分區(qū)成子文件分區(qū)的文件進(jìn)行去重復(fù)的步驟的流程圖。圖6所示的步驟始于步驟602,并且前進(jìn)到步驟604,在該步驟,去重復(fù)機(jī)制116處理文件。步驟606針對(duì)將該文件分區(qū)成子文件分區(qū)。在一個(gè)示例性實(shí)施方式中,一次對(duì)文件全部去重復(fù)需要大量時(shí)間。因此,去重復(fù)機(jī)制116將該文件劃分成大小相等的子文件分區(qū),所述子文件分區(qū)一次一個(gè)、而不是一起被去重復(fù)。步驟608針對(duì)標(biāo)識(shí)出具有第一去重復(fù)部分的子文件分區(qū)。如果該文件是完全未去重復(fù)的,則去重復(fù)進(jìn)程在第一子文件分區(qū)處開始。如果該文件是部分去重復(fù)的,則去重復(fù)進(jìn)程在與包括未去重復(fù)部分的第一子文件分區(qū)相關(guān)聯(lián)的起始偏移量處開始。如在此所解釋的那樣,如果去重復(fù)進(jìn)程在完成子文件分區(qū)以前暫停,則去重復(fù)進(jìn)程在與第一未去重復(fù)部分相關(guān)聯(lián)的起始偏移量處重啟,因?yàn)槟抢锸侨ブ貜?fù)進(jìn)程曾經(jīng)停止的地方。此外,在第一未去重復(fù)部分之前的塊曾是提交給塊存儲(chǔ)的最后一個(gè)塊。步驟610針對(duì)定義具有該子文件分區(qū)的至少一個(gè)塊。步驟612涉及確定去重復(fù)機(jī)制116是否接收到中止第一未去重復(fù)部分的分塊的暫停指令。根據(jù)替換的實(shí)施方式,系統(tǒng)崩潰致使去重復(fù)進(jìn)程有效地以類似方式暫停。如果去重復(fù)機(jī)制116暫停,則圖6中所述的方法前進(jìn)到步驟614。步驟614針對(duì)等待直到去重復(fù)進(jìn)程恢復(fù)第一未去重復(fù)部分的分塊。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116從文件系統(tǒng)接收指令,并且在第一未去重復(fù)部分的起始偏移量處重啟所述至少一個(gè)的定義。另一方面,如果去重復(fù)機(jī)制116在去重復(fù)進(jìn)程期間不暫停,則圖6中所述的方法前進(jìn)到步驟616。步驟616針對(duì)更新去重復(fù)元數(shù)據(jù)和塊存儲(chǔ)元數(shù)據(jù)。在一個(gè)示例性實(shí)施方式中,去重復(fù)機(jī)制116用新塊定義更新流圖中的映射。在另一示例性實(shí)施方式中,去重復(fù)機(jī)制116使用到之前去重復(fù)的塊的原始映射以及與新塊定義相關(guān)聯(lián)的新映射來(lái)創(chuàng)建新的流圖。步驟618針對(duì)截短文件并且將所述至少一個(gè)塊提交給塊存儲(chǔ)。包括第一未去重復(fù)部分的子文件分區(qū)被從該文件中移除,因?yàn)橄鄳?yīng)文件數(shù)據(jù)的副本被存儲(chǔ)在塊存儲(chǔ)中。步驟620針對(duì)確定是否對(duì)下一子文件分區(qū)進(jìn)行去重復(fù)。如果該文件中不再存在子文件分區(qū),則圖6中所述的方法前進(jìn)到步驟622。另一方面,如果存在附加的子文件分區(qū),則圖6中所述的方法返回到步驟608。步驟622終止圖6所描述的方法的步驟。示例性聯(lián)網(wǎng)以及分布式環(huán)境本領(lǐng)域技術(shù)人員可以理解,此處描述的各實(shí)施例和方法可結(jié)合任何計(jì)算機(jī)或其它客戶機(jī)或服務(wù)器設(shè)備來(lái)實(shí)現(xiàn),其可被部署為計(jì)算機(jī)網(wǎng)絡(luò)的部分或在分布式計(jì)算環(huán)境中,并且可以被連接到任何類型一個(gè)或多個(gè)數(shù)據(jù)存儲(chǔ)。在這一點(diǎn)上,此處描述的各實(shí)施例可在具有任何數(shù)量的存儲(chǔ)器或存儲(chǔ)單元的、并且任何數(shù)量的應(yīng)用和進(jìn)程跨任何數(shù)量的存儲(chǔ)單元發(fā)生的任何計(jì)算機(jī)系統(tǒng)或環(huán)境中實(shí)現(xiàn)。這包括但不限于具有部署在具有遠(yuǎn)程或本地存儲(chǔ)的網(wǎng)絡(luò)環(huán)境或分布式計(jì)算環(huán)境中的服務(wù)器計(jì)算機(jī)和客戶機(jī)計(jì)算機(jī)的環(huán)境。分布式計(jì)算通過(guò)計(jì)算設(shè)備和系統(tǒng)之間的通信交換提供了計(jì)算機(jī)資源和服 務(wù)的共享。這些資源和服務(wù)包括信息的交換、對(duì)于諸如文件等對(duì)象的高速緩存存儲(chǔ)和盤存儲(chǔ)。這些資源和服務(wù)還包括多個(gè)處理單元之間的處理能力共享以便進(jìn)行負(fù)載平衡、資源擴(kuò)展、處理專門化,等等。分布式計(jì)算利用網(wǎng)絡(luò)連接,從而允許客戶機(jī)利用它們的集體力量來(lái)使整個(gè)企業(yè)受益。就此,各種設(shè)備可具有可如參考本發(fā)明的各實(shí)施例描述地參與資源管理機(jī)制的應(yīng)用、對(duì)象或資源。圖7提供了示例性的聯(lián)網(wǎng)或分布式計(jì)算環(huán)境的示意圖。該分布式計(jì)算環(huán)境包括計(jì)算對(duì)象710、712等以及計(jì)算對(duì)象或設(shè)備720、722、724、726、728等,這些計(jì)算對(duì)象或設(shè)備可包括如由示例應(yīng)用730、732、734、736、738表示的程序、方法、數(shù)據(jù)存儲(chǔ)、可編程邏輯等。可以理解,計(jì)算對(duì)象710、712等以及計(jì)算對(duì)象或設(shè)備720、722、724、726、728等可包括不同的設(shè)備,諸如個(gè)人數(shù)字助理(PDA)、音頻/視頻設(shè)備、移動(dòng)電話、MP3播放器、個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)等。每一個(gè)計(jì)算對(duì)象710、712等以及計(jì)算對(duì)象或設(shè)備720、722、724、726、728等可通過(guò)通信網(wǎng)絡(luò)726直接或間接與一個(gè)或多個(gè)其他計(jì)算對(duì)象710、712等以及計(jì)算對(duì)象或設(shè)備720、722、724、728、740等進(jìn)行通信。盡管在圖7中被示為單個(gè)元件,但通信網(wǎng)絡(luò)740可包括向圖7的系統(tǒng)提供服務(wù)的其他計(jì)算對(duì)象和計(jì)算設(shè)備和/或可表示未示出的多個(gè)互連網(wǎng)絡(luò)。每個(gè)計(jì)算對(duì)象710、712等或計(jì)算對(duì)象或設(shè)備720、722、724、726、728等還可以包含應(yīng)用,諸如可以利用API或其他對(duì)象、軟件、固件和/或硬件的、適于根據(jù)本發(fā)明的各實(shí)施例所提供的應(yīng)用實(shí)現(xiàn)與其進(jìn)行通信的應(yīng)用730、732、734、736、738。存在支持分布式計(jì)算環(huán)境的各種系統(tǒng)、組件和網(wǎng)絡(luò)配置。例如,計(jì)算系統(tǒng)可由有線或無(wú)線系統(tǒng)、本地網(wǎng)絡(luò)或廣泛分布的網(wǎng)絡(luò)連接在一起。當(dāng)前,許多網(wǎng)絡(luò)被耦合至因特網(wǎng),后者為廣泛分布的計(jì)算提供了基礎(chǔ)結(jié)構(gòu)并包含許多不同的網(wǎng)絡(luò),但任何網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)都可用于便于與如各實(shí)施例中所描述的系統(tǒng)的示例性通信。由此,可使用諸如客戶機(jī)/服務(wù)器、對(duì)等、或混合體系結(jié)構(gòu)之類的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)的主機(jī)。“客戶機(jī)”是使用與它無(wú)關(guān)的另一類或組的服務(wù)的一個(gè)類或組中的成員??蛻魴C(jī)可以是進(jìn)程,例如,大致上是請(qǐng)求另一程序或進(jìn)程所提供的服務(wù)的一組指令或任務(wù)??蛻魴C(jī)進(jìn)程利用所請(qǐng)求的服務(wù),而不必“知道”有關(guān)其他程序或服務(wù)本身的任何工作細(xì)節(jié)。在客戶機(jī)/服務(wù)器體系結(jié)構(gòu)中,尤其在聯(lián)網(wǎng)系統(tǒng)中,客戶機(jī)通常是訪問(wèn)另一計(jì)算機(jī)(例如,服務(wù)器)所提供的共享網(wǎng)絡(luò)資源的計(jì)算機(jī)。在圖7的圖示中,作為非限制性示例,計(jì)算對(duì)象或設(shè)備720、722、724、726、728等可被認(rèn)為是客戶機(jī)而計(jì)算對(duì)象710、712等可被認(rèn)為是服務(wù)器,其中計(jì)算對(duì)象710、712等擔(dān)當(dāng)提供數(shù)據(jù)服務(wù)的服務(wù)器,諸如從客戶機(jī)計(jì)算對(duì)象或設(shè)備720、722、724、726、728等接收數(shù)據(jù)、存儲(chǔ)數(shù)據(jù)、處理數(shù)據(jù)、向客戶機(jī)計(jì)算對(duì)象或設(shè)備720、722、724、726、728等發(fā)送數(shù)據(jù),但任何計(jì)算機(jī)都可取決于環(huán)境而被認(rèn)為是客戶機(jī)、服務(wù)器、或兩者。服務(wù)器通常是可通過(guò)諸如因特網(wǎng)或無(wú)線網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)之類的遠(yuǎn)程網(wǎng)絡(luò)或本地網(wǎng)絡(luò)訪問(wèn)的遠(yuǎn)程計(jì)算機(jī)系統(tǒng)??蛻魴C(jī)進(jìn)程可在第一計(jì)算機(jī)系統(tǒng)中活動(dòng),而服務(wù)器進(jìn)程可在第二計(jì)算機(jī)系統(tǒng)中活動(dòng),它們通過(guò)通信介質(zhì)相互通信,由此提供分布式功能并允許多個(gè)客戶機(jī)利用服務(wù)器的信息收集能力。在其中通信網(wǎng)絡(luò)740或總線例如是因特網(wǎng)的網(wǎng)絡(luò)環(huán)境中,計(jì)算對(duì)象710、712等可以是其他計(jì)算對(duì)象或設(shè)備720、722、724、726、728等通過(guò)諸如超文本傳輸協(xié)議(HTTP)等多種已知協(xié)議中的任一種與其通信的web服務(wù)器。擔(dān)當(dāng)服務(wù)器的計(jì)算對(duì)象710、712 等還可用作客戶機(jī),例如計(jì)算對(duì)象或設(shè)備720、722、724、726、728等,這是分布式計(jì)算環(huán)境的特性。示例性計(jì)算設(shè)備如上所述,有利地,本文所描述的技術(shù)可應(yīng)用于任何設(shè)備。因此,應(yīng)當(dāng)理解,構(gòu)想了結(jié)合各實(shí)施例使用的所有種類的手持式、便攜式和其它計(jì)算設(shè)備和計(jì)算對(duì)象。因此,以下在圖8中所述的通用遠(yuǎn)程計(jì)算機(jī)只是計(jì)算設(shè)備的一個(gè)示例。各實(shí)施例可部分地經(jīng)由操作系統(tǒng)來(lái)實(shí)現(xiàn),以供設(shè)備或?qū)ο蟮姆?wù)開發(fā)者使用和/或被包括在用于執(zhí)行此處所述的各實(shí)施例的一個(gè)或多個(gè)功能方面的應(yīng)用軟件內(nèi)。軟件可以在由諸如客戶端工作站、服務(wù)器或其它設(shè)備等一個(gè)或多個(gè)計(jì)算機(jī)執(zhí)行的諸如程序模塊等計(jì)算機(jī)可執(zhí)行指令的通用上下文中描述。本領(lǐng)域的技術(shù)人員可以理解,計(jì)算機(jī)系統(tǒng)具有可用于傳遞數(shù)據(jù)的各種配置和協(xié)議,并且由此沒(méi)有特定配置或協(xié)議應(yīng)當(dāng)被認(rèn)為是限制性的。圖8由此示出了其中可實(shí)現(xiàn)本文所述的各實(shí)施例的一個(gè)或多個(gè)方面的合適的計(jì)算系統(tǒng)環(huán)境800的一個(gè)示例,盡管如上所述,計(jì)算系統(tǒng)環(huán)境800僅為合適的計(jì)算環(huán)境的一個(gè)示例,并非對(duì)使用范圍或功能提出任何限制。此外,也不應(yīng)當(dāng)將計(jì)算系統(tǒng)環(huán)境800解釋為對(duì)在示例性計(jì)算系統(tǒng)環(huán)境800中所示的組件中的任何一個(gè)或其組合有任何依賴。參考圖8,用于實(shí)現(xiàn)一個(gè)或多個(gè)實(shí)施例的示例性遠(yuǎn)程設(shè)備包括計(jì)算機(jī)810形式的通用計(jì)算設(shè)備。計(jì)算機(jī)810的組件可包括,但不限于,處理單元820、系統(tǒng)存儲(chǔ)器830、以及將包括系統(tǒng)存儲(chǔ)器的各種系統(tǒng)組件耦合到處理單元822的系統(tǒng)總線820。計(jì)算機(jī)810通常包括各種計(jì)算機(jī)可讀介質(zhì),并且可以是可由計(jì)算機(jī)810訪問(wèn)的任何可用介質(zhì)。系統(tǒng)存儲(chǔ)器830可包括諸如只讀存儲(chǔ)器(ROM)和/或隨機(jī)存取存儲(chǔ)器(RAM)之類的易失性和/或非易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)。作為示例而非限制,系統(tǒng)存儲(chǔ)器830還可包括操作系統(tǒng)、應(yīng)用程序、其他程序模塊、以及程序數(shù)據(jù)。用戶可通過(guò)輸入設(shè)備840向計(jì)算機(jī)810輸入命令和信息。監(jiān)視器或其他類型的顯示設(shè)備也經(jīng)由諸如輸出接口 850之類的接口連接到系統(tǒng)總線822。除監(jiān)視器以外,計(jì)算機(jī)還可包括諸如揚(yáng)聲器和打印機(jī)之類的其他外圍輸出設(shè)備,它們可通過(guò)輸出接口 850連接。計(jì)算機(jī)810可使用到一個(gè)或多個(gè)其他遠(yuǎn)程計(jì)算機(jī)(諸如遠(yuǎn)程計(jì)算機(jī)870)的邏輯連接在聯(lián)網(wǎng)或分布式環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)870可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其他常見網(wǎng)絡(luò)節(jié)點(diǎn)、或者任何其他遠(yuǎn)程媒體消費(fèi)或傳輸設(shè)備,并且可包括以上關(guān)于計(jì)算機(jī)810所述的任何或全部元件。圖8所示的邏輯連接包括諸如局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)之類的網(wǎng)絡(luò)872,但也可包括其他網(wǎng)絡(luò)/總線。這些聯(lián)網(wǎng)環(huán)境在家庭、辦公室、企業(yè)范圍的計(jì)算機(jī)網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)和因特網(wǎng)中是常見的。如上所述,盡管結(jié)合各種計(jì)算設(shè)備和網(wǎng)絡(luò)體系結(jié)構(gòu)描述了各示例性實(shí)施例,但基本概念可被應(yīng)用于其中期望改進(jìn)資源使用的效率的任何網(wǎng)絡(luò)系統(tǒng)和任何計(jì)算設(shè)備或系統(tǒng)。而且,存在實(shí)現(xiàn)相同或相似功能的多種方法,例如適當(dāng)?shù)腁 PI、工具箱、驅(qū)動(dòng)程序代碼、操作系統(tǒng)、控件、獨(dú)立或可下載軟件對(duì)象等,它們使得應(yīng)用和服務(wù)能夠使用此處提供的技術(shù)。由此,此處的各實(shí)施例從API (或其他軟件對(duì)象)的觀點(diǎn)以及從實(shí)現(xiàn)如此處描述的一個(gè)或多個(gè)實(shí)施例的軟件或硬件對(duì)象構(gòu)想。由此,此處所述的各實(shí)施例可具有完全采用硬件、部分采用硬件并且部分采用軟件、以及采用軟件的方面。 本文中所使用的詞語(yǔ)“示例性”意味著用作示例、實(shí)例、或說(shuō)明。為避免疑惑,本文所公開的主題不限于這些示例。另外,在此所述的被描述為“示例性”的任意方面或設(shè)計(jì)并不一定要被解釋為相比其它方面或設(shè)計(jì)更優(yōu)選或有利。此外,在使用術(shù)語(yǔ)“包括”、“具有”、“包含”和其他類似詞語(yǔ)的程度上,為避免疑惑,這些術(shù)語(yǔ)旨在當(dāng)用于權(quán)利要求中時(shí)以類似于術(shù)語(yǔ)“包括”作為開放的過(guò)渡詞的方式是包含性的而不排除任何附加或其他元素。如所述的,此處所述的各種技術(shù)可結(jié)合硬件或軟件或,在適當(dāng)時(shí),以兩者的組合來(lái)實(shí)現(xiàn)。如此處所使用的,術(shù)語(yǔ)“組件”、“模塊”、“系統(tǒng)”等同樣旨在指計(jì)算機(jī)相關(guān)實(shí)體,或者是硬件、硬件和軟件的組合、軟件或者是執(zhí)行中的軟件。例如,組件可以是,但不限于是,在處理器上運(yùn)行的進(jìn)程、處理器、對(duì)象、可執(zhí)行碼、執(zhí)行的線程、程序和/或計(jì)算機(jī)。作為說(shuō)明,在計(jì)算機(jī)上運(yùn)行的應(yīng)用和計(jì)算機(jī)都可以是組件。一個(gè)或多個(gè)組件可以駐留在進(jìn)程和/或執(zhí)行線程中,并且組件可以位于一個(gè)計(jì)算機(jī)內(nèi)和/或分布在兩個(gè)或更多計(jì)算機(jī)之間。如前所述的系統(tǒng)已經(jīng)參考若干組件之間的交互來(lái)描述??梢岳斫?,這些系統(tǒng)和組件可包括組件或指定的子組件、某些指定的組件或子組件和/或附加的組件,并且根據(jù)上述內(nèi)容的各種置換和組合。子組件還可作為通信地耦合到其他組件的組件來(lái)實(shí)現(xiàn),而不是被包括在父組件內(nèi)(層次性)。另外,應(yīng)注意到一個(gè)或多個(gè)組件可被組合成提供聚集功能的單個(gè)組件,或被分成若干單獨(dú)的子組件,且諸如管理層等任何一個(gè)或多個(gè)中間層可被設(shè)置成通信耦合到這樣的子組件以便提供集成功能。此處所述的任何組件也可與一個(gè)或多個(gè)此處未專門描述的但本領(lǐng)域技術(shù)人員一般已知的其他組件進(jìn)行交互。鑒于本文所述的示例性系統(tǒng),可根據(jù)參考各附圖的流程圖還可理解根據(jù)所述的主題來(lái)實(shí)現(xiàn)方法。盡管為了說(shuō)明簡(jiǎn)潔起見,作為一系列框示出和描述的方法,但是應(yīng)當(dāng)理解,各實(shí)施例不僅僅限于框的次序,因?yàn)橐恍┛蚩梢耘c此處所描繪和描述的框不同的次序發(fā)生和/或與其他框并發(fā)地發(fā)生。盡管經(jīng)由流程圖示出了非順序或分支的流程,但可以理解,可實(shí)現(xiàn)達(dá)到相同或類似結(jié)果的各種其他分支、流程路徑和框的次序。此外,某些示出的框在實(shí)現(xiàn)下文所述的方法中是可選的。結(jié)語(yǔ)盡管本發(fā)明易于作出各種修改和替換構(gòu)造,但其某些說(shuō)明性實(shí)施例在附圖中示出并在上面被詳細(xì)地描述。然而應(yīng)當(dāng)了解,這不旨在將本發(fā)明限于所公開的具體形式,而是相反地,旨在覆蓋落入本發(fā)明的精神和范圍之內(nèi)的所有修改、替換構(gòu)造和等效方案。除此處所述的各實(shí)施例以外,應(yīng)當(dāng)理解,可使用其他類似實(shí)施例,或者可對(duì)所述實(shí)施例作出修改和添加以便執(zhí)行對(duì)應(yīng)實(shí)施例的相同或等效功能而不背離這些實(shí)施例。此外,多個(gè)處理芯片或多個(gè)設(shè)備可共享此處所述的一個(gè)或多個(gè)功能的性能,并且類似 地,存儲(chǔ)可跨多個(gè)設(shè)備實(shí)現(xiàn)。因此,本發(fā)明不應(yīng)限于任何單個(gè)實(shí)施例,而是應(yīng)當(dāng)根據(jù)所附權(quán)利要求書的廣度、精神和范圍來(lái)解釋。
權(quán)利要求
1.一種在計(jì)算機(jī)環(huán)境中至少部分在至少一個(gè)處理器上執(zhí)行的方法,包括將具有至少一個(gè)未去重復(fù)的部分(104)的文件(102)重新優(yōu)化成完全去重復(fù)的文件(402,404),包括處理(506)所述文件的每個(gè)未去重復(fù)的部分以確定至少一個(gè)塊(310,320);將所述至少一個(gè)塊提交(520)給塊存儲(chǔ)(110);以及將與所述文件相關(guān)聯(lián)的元數(shù)據(jù)(106)修改(616)為包括對(duì)每個(gè)塊的引用。
2.如權(quán)利要求I所述的方法,其特征在于,還包括將所述文件中被去重復(fù)的部分隔開的兩個(gè)未去重復(fù)的部分組合成包括每個(gè)未去重復(fù)的部分和所述去重復(fù)的部分的單個(gè)未去重復(fù)的部分,然后處理所述單個(gè)未去重復(fù)的部分。
3.如權(quán)利要求I所述的方法,其特征在于,處理至少一個(gè)未去重復(fù)的部分包括定義從先于或等于與所述未去重復(fù)的部分相關(guān)聯(lián)的起始文件偏移量的一文件偏移量開始的塊;以及通過(guò)與完全包含在在先的去重復(fù)部分中的最后一個(gè)塊對(duì)齊來(lái)確定所述文件偏移量。
4.如權(quán)利要求I所述的方法,其特征在于,處理至少一個(gè)未去重復(fù)的部分包括通過(guò)在后繼于或等于與所述未去重復(fù)的部分相關(guān)聯(lián)的結(jié)束文件偏移量的一文件偏移量處結(jié)束所述部分的分塊來(lái)定義塊;以及基于所述未去重復(fù)的部分的分塊與同在先的去重復(fù)的部分相關(guān)聯(lián)的一個(gè)或多個(gè)現(xiàn)有塊對(duì)齊之處來(lái)確定所述結(jié)束文件偏移量。
5.如權(quán)利要求4所述的方法,其特征在于,分塊繼續(xù)到超出所述未去重復(fù)的部分的結(jié)尾,并且還包括確定塊對(duì)齊是否在基于大小的閾值或基于塊數(shù)目的閾值內(nèi)被實(shí)現(xiàn),并且如果塊對(duì)齊未在所述閾值內(nèi)實(shí)現(xiàn),則停止分塊。
6.如權(quán)利要求I所述的方法,其特征在于,還包括暫停并隨后恢復(fù)所述暫停以前的對(duì)所述文件的重新優(yōu)化以及所述至少一個(gè)塊到所述塊存儲(chǔ)的提交,其中所述暫?;谝粋€(gè)或多個(gè)標(biāo)準(zhǔn)進(jìn)行,所述標(biāo)準(zhǔn)包括文件大小、執(zhí)行所述重新優(yōu)化的機(jī)器何時(shí)變?yōu)榉强臻e、以及所述機(jī)器何時(shí)將關(guān)閉。
7.如權(quán)利要求I所述的方法,其特征在于,所述塊被提交給塊存儲(chǔ),并且還包括從所述塊存儲(chǔ)中對(duì)由于所述文件的重新優(yōu)化而不再被引用的至少一個(gè)塊進(jìn)行垃圾收集。
8.—種在計(jì)算環(huán)境中的系統(tǒng),包括去重復(fù)機(jī)制(116),所述去重復(fù)機(jī)制(116)被配置為將具有至少一個(gè)未去重復(fù)的部分(306,316)的文件(102)重新優(yōu)化成完全去重復(fù)的文件(402,404),所述去重復(fù)機(jī)制被配置為將每個(gè)未去重復(fù)的部分分塊(610)成至少一個(gè)經(jīng)重新優(yōu)化的塊(310,320);在完全重新優(yōu)化所述文件以前將至少一個(gè)經(jīng)重新優(yōu)化的塊提交(520)到塊存儲(chǔ)(110)中;以及修改(616)表示被提交的文件的每個(gè)塊的文件元數(shù)據(jù)(106)。
9.如權(quán)利要求8所述的方法,其特征在于,所述去重復(fù)機(jī)制將所述文件分區(qū)成子文件分區(qū),在開始重新優(yōu)化下一子分區(qū)以前或者當(dāng)最后一個(gè)子文件分區(qū)已經(jīng)被重新優(yōu)化時(shí)提交每個(gè)子文件分區(qū)的每個(gè)經(jīng)重新優(yōu)化的塊;以及基于哪個(gè)子文件分區(qū)已經(jīng)被重新優(yōu)化來(lái)截短所述文件。
10.一個(gè)或多個(gè)具有計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀介質(zhì),所述計(jì)算機(jī)可執(zhí)行指令在被執(zhí)行時(shí)執(zhí)行以下步驟,包括 為文件(102)的未去重復(fù)的部分(306,316)定義(514)塊(310,320); 使所述塊的塊邊界與同所述文件的至少一個(gè)去重復(fù)的部分相關(guān)聯(lián)的文件偏移量(302,308)對(duì)齊(518); 基于所述塊邊界更新(520)與所述文件相關(guān)聯(lián)的元數(shù)據(jù)(106);以及將所述塊提交(520 ) 給塊存儲(chǔ)(110)。
全文摘要
本發(fā)明涉及部分去重復(fù)的文件的優(yōu)化。本公開針對(duì)將具有至少一個(gè)未去重復(fù)的部分的文件變換成完全去重復(fù)的文件。針對(duì)所述至少一個(gè)未去重復(fù)部分中的每個(gè),去重復(fù)機(jī)制在與所述至少一個(gè)未去重復(fù)部分相關(guān)聯(lián)的文件偏移量之間定義至少一個(gè)塊。與所述至少一個(gè)塊相關(guān)聯(lián)的塊邊界被存儲(chǔ)在去重復(fù)元數(shù)據(jù)內(nèi)。去重復(fù)機(jī)制使所述至少一個(gè)塊與所述文件的至少一個(gè)去重復(fù)部分的塊邊界對(duì)齊。然后,所述至少一個(gè)塊被提交給塊存儲(chǔ)。
文檔編號(hào)G06F17/30GK102880663SQ20121032020
公開日2013年1月16日 申請(qǐng)日期2012年8月31日 優(yōu)先權(quán)日2011年9月1日
發(fā)明者R·卡拉赫, K·哈桑, P·A·奧爾泰安, J·R·本頓, C·H·張, A·古普塔 申請(qǐng)人:微軟公司