本發(fā)明涉及數(shù)據(jù)存儲技術(shù)領(lǐng)域,特別涉及一種碎片整理方法、裝置及設(shè)備。
背景技術(shù):
眾所周知,磁盤在使用一段時間后,隨著反復(fù)地文件寫入和刪除,磁盤中連續(xù)的空閑空間越來越小,從而使同一文件不能被整體存儲在連續(xù)的空閑空間,而是被分散成多個碎片,保存到磁盤的不同空閑空間中。如圖1所示,在大小為32KB和16KB的文件刪除后,形成48KB的空閑時間,然而這48KB的空閑存儲空間并不連續(xù)。如果要新寫入大小為48KB的文件,則需將其拆分成2塊,分別寫入到兩個空間中。這樣,后續(xù)在讀取這個48KB的文件時,便需要分別到兩個不同的空間去讀取。相較于到單個空間讀取而言,增加了磁頭的來回移動次數(shù),致使讀寫性能急劇下降。時下為了避免上述情況的發(fā)生,一般均會對磁盤定期進(jìn)行碎片整理。
現(xiàn)有技術(shù)在進(jìn)行磁盤碎片整理時,文件系統(tǒng)會遍歷由本地文件的元數(shù)據(jù)形成的B+樹結(jié)構(gòu),在B+樹結(jié)構(gòu)中遍歷到一個文件后,根據(jù)該文件所包含的每一個數(shù)據(jù)塊所在chunk(分片)的有效數(shù)據(jù)占用率來判斷是否進(jìn)行磁盤碎片整理,如果需要進(jìn)行磁盤碎片整理,則將該chunk中存儲的數(shù)據(jù)塊遷移至目標(biāo)chunk,并將相應(yīng)元數(shù)據(jù)中該數(shù)據(jù)塊的位置信息進(jìn)行更新。其中,B+樹結(jié)構(gòu)如圖2所示,文件系統(tǒng)會為存儲的每一個文件分配一個FID(File Identifier,文件標(biāo)識),之后根據(jù)該FID將該文件的元數(shù)據(jù)插入B+樹結(jié)構(gòu)。在圖2中Leve17用來保存文件的元數(shù)據(jù),該元數(shù)據(jù)包括FID以及文件所包含的全部數(shù)據(jù)塊的位置信息,其中數(shù)據(jù)塊的位置信息指向Leve18中的數(shù)據(jù)塊。而chunk是文件系統(tǒng)在進(jìn)行空間分配時將磁盤按照固定大小劃分出來的,比如4MB大小一個chunk。通常情況下,邏輯上兩個連續(xù)的chunk,其在物理磁盤上位置也是相鄰的。其中,文件系統(tǒng)在B+樹結(jié)構(gòu)中遍歷到一個文件后,獲取該文件所包含的每一個數(shù)據(jù)塊所在chunk的有效數(shù)據(jù)占用率;如果一個數(shù)據(jù)塊所在chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限(比如20%),則需進(jìn)行磁盤碎片整理,具體整理過程可如圖3所示。在圖3中數(shù)據(jù)塊1所在chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則將數(shù)據(jù)塊1寫入目標(biāo)chunk,然后對數(shù)據(jù)塊1的位置信息進(jìn)行更新;對于數(shù)據(jù)塊2,其所在chunk的有效數(shù)據(jù)占用率高于預(yù)設(shè)門限,則不需進(jìn)行整理。這樣假設(shè)在進(jìn)行整理前僅有圖4所示的一個空閑的chunk,在通過上述方式進(jìn)行整理將磁盤碎片集中到一個chunk后,便有三個空閑的chunk。
現(xiàn)有技術(shù)至少存在以下問題:
上述碎片整理方法需要遍歷整個元數(shù)據(jù)的B+樹結(jié)構(gòu),當(dāng)磁盤占用率高時,這種整理方式的效率很低。比如對于一個4T磁盤來講,假設(shè)文件大小平均為32KB,則這個磁盤可寫入12萬個小文件;如果僅有1千個小文件需要進(jìn)行遷移,即存儲這1千個小文件的至少一個chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則在遷移這1千個文件時,由于若直接遍歷上述至少一個chunk并進(jìn)行遷移,無法獲取這1千個小文件的元數(shù)據(jù)信息,進(jìn)而對元數(shù)據(jù)信息進(jìn)行更新,因此還需要采取遍歷整個元數(shù)據(jù)的B+樹結(jié)構(gòu)的方式,讀取全部12萬小文件的元數(shù)據(jù),以逐個小文件進(jìn)行判斷并處理,致使上述碎片整理方式較為繁瑣和復(fù)雜,會消耗大量時間。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供了一種碎片整理方法、裝置及設(shè)備。所述技術(shù)方案如下:
第一方面,提供了一種碎片整理方法,所述方法包括:
獲取存儲器中chunk的有效數(shù)據(jù)占用率,所述chunk中存儲有數(shù)據(jù)塊及所述數(shù)據(jù)塊的元數(shù)據(jù)索引;
若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則獲取所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述元數(shù)據(jù)索引中,包括所述數(shù)據(jù)塊所屬文件的FID和所述數(shù)據(jù)塊的原位置信息;
在根據(jù)所述數(shù)據(jù)塊的原位置信息確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊后,將所述數(shù)據(jù)塊作為待遷移的數(shù)據(jù)塊,為所述數(shù)據(jù)塊分配目標(biāo)chunk,將所述數(shù)據(jù)塊遷移至所述目標(biāo)chunk;
根據(jù)所述FID,查找所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,將所述元數(shù)據(jù)信息中包含的所述數(shù)據(jù)塊遷移前的所述原位置信息更新為所述數(shù)據(jù)塊遷移后的目的位置信息。
在第一方面的第一種可能的實現(xiàn)方式中,在將所述數(shù)據(jù)塊遷移至目標(biāo)chunk中后,還會在目標(biāo)chunk中寫入所述數(shù)據(jù)塊的元數(shù)據(jù)索引,以便后續(xù)過程中當(dāng)目標(biāo)chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限時,方便根據(jù)寫入在目標(biāo)chunk中的元數(shù)據(jù)索引再次在數(shù)據(jù)塊遷移后對上述元數(shù)據(jù)信息進(jìn)行更新,詳細(xì)過程如下:
將所述目的位置信息以及所述FID作為所述數(shù)據(jù)塊的元數(shù)據(jù)索引寫入所述目標(biāo)chunk中。更進(jìn)一步地,基于TLV(Type Length Value,類型長度值)格式,在所述目標(biāo)chunk中寫入所述目的位置信息以及所述FID,得到所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述目的位置信息包括所述數(shù)據(jù)塊的長度值、以及所述數(shù)據(jù)塊遷移后的目的存儲地址。
結(jié)合第一方面,在第一方面的第二種可能的實現(xiàn)方式中,所述獲取存儲器中分片chunk的有效數(shù)據(jù)占用率之前,所述方法還包括:
為所述chunk設(shè)置一個位圖文件,所述位圖文件中的每一個數(shù)值位用于標(biāo)識所述chunk中對應(yīng)空間的被占用情況;
其中,當(dāng)所述位圖文件中一個數(shù)值位的取值為第一常數(shù)時,表征所述數(shù)值位指示的空間已被有效數(shù)據(jù)占用;當(dāng)所述位圖文件中一個數(shù)值位的取值為第二常數(shù)時,表征所述數(shù)值位指示的空間未被有效數(shù)據(jù)占用。
結(jié)合第一方面的第二種可能的實現(xiàn)方式,在第一方面的第三種可能的實現(xiàn)方式中,所述獲取存儲器中分片chunk的有效數(shù)據(jù)占用率,包括:
統(tǒng)計所述位圖文件中取值為所述第一常數(shù)的數(shù)值位個數(shù);
獲取所述位圖文件中數(shù)值位總個數(shù);
計算所述取值為所述第一常數(shù)的數(shù)值位個數(shù)與所述數(shù)值位總個數(shù)之間的比值,得到所述chunk的有效數(shù)據(jù)占用率。
結(jié)合第一方面的第二種可能的實現(xiàn)方式,在第一方面的第四種可能的實現(xiàn)方式中,所述原位置信息中包括所述數(shù)據(jù)塊遷移前的原存儲地址和所述數(shù)據(jù)塊的長度值,所述方法還包括:
根據(jù)所述原存儲地址和所述長度值,在所述chunk的位圖文件中確定所述數(shù)據(jù)塊占用空間對應(yīng)的至少一個數(shù)值位;
若所述至少一個數(shù)值位中每一個數(shù)值位的取值均為所述第一常數(shù),則確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊。
結(jié)合第二種至第四種可能的實現(xiàn)方式,在第一方面的第五種可能的實現(xiàn)方式中,所述方法還包括:
若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則在將所述chunk中每一個有效數(shù)據(jù)塊均寫入分配的對應(yīng)目標(biāo)chunk后,分別將所述chunk的位圖文件中每一個數(shù)值位賦值為所述第二常數(shù)。
結(jié)合第一方面,在第一方面的第六種可能的實現(xiàn)方式中,所述根據(jù)所述文件標(biāo)識,查找所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,包括:
在元數(shù)據(jù)樹結(jié)構(gòu)中查找存儲有所述FID的元數(shù)據(jù)節(jié)點,所述元數(shù)據(jù)節(jié)點中存儲了所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息中至少包括所述文件的FID和所述文件包含的每一個數(shù)據(jù)塊的位置信息;
其中,所述元數(shù)據(jù)樹結(jié)構(gòu)中以元數(shù)據(jù)節(jié)點形式記錄了本地存儲的全部文件的元數(shù)據(jù)信息。
第二方面,提供了一種碎片整理裝置,所述裝置包括:
第一獲取模塊,用于獲取存儲器中chunk的有效數(shù)據(jù)占用率,所述chunk中存儲有數(shù)據(jù)塊及所述數(shù)據(jù)塊的元數(shù)據(jù)索引;
第二獲取模塊,用于若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則獲取所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述元數(shù)據(jù)索引中,包括所述數(shù)據(jù)塊所屬文件的FID和所述數(shù)據(jù)塊的原位置信息;
分配模塊,用于在根據(jù)所述數(shù)據(jù)塊的原位置信息確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊后,將所述數(shù)據(jù)塊作為待遷移的數(shù)據(jù)塊,為所述數(shù)據(jù)塊分配目標(biāo)chunk,將所述數(shù)據(jù)塊遷移至所述目標(biāo)chunk;
查找模塊,用于根據(jù)所述FID,查找所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息;
更新模塊,用于將所述元數(shù)據(jù)信息中包含的所述數(shù)據(jù)塊遷移前的所述原位置信息更新為所述數(shù)據(jù)塊遷移后的目的位置信息。
在第二方面的第一種可能的實現(xiàn)方式中,所述裝置還包括:
寫入模塊,用于基于TLV格式,在所述目標(biāo)chunk中寫入所述目的位置信息以及所述FID,得到所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述目的位置信息包括所述數(shù)據(jù)塊的長度值、以及所述數(shù)據(jù)塊遷移后的目的存儲地址。
結(jié)合第二方面,在第二方面的第二種可能的實現(xiàn)方式中,所述裝置還包括:
設(shè)置模塊,用于為所述chunk設(shè)置一個位圖文件,所述位圖文件中的每一個數(shù)值位用于標(biāo)識所述chunk中對應(yīng)空間的被占用情況;
其中,當(dāng)所述位圖文件中一個數(shù)值位的取值為第一常數(shù)時,表征所述數(shù)值位指示的空間已被有效數(shù)據(jù)占用;當(dāng)所述位圖文件中一個數(shù)值位的取值為第二常數(shù)時,表征所述數(shù)值位指示的空間未被有效數(shù)據(jù)占用。
結(jié)合第二方面的第二種可能的實現(xiàn)方式,在第二方面的第三種可能的實現(xiàn)方式中,所述第一獲取模塊,用于統(tǒng)計所述位圖文件中取值為所述第一常數(shù)的數(shù)值位個數(shù);獲取所述位圖文件中數(shù)值位總個數(shù);計算所述取值為所述第一常數(shù)的數(shù)值位個數(shù)與所述數(shù)值位總個數(shù)之間的比值,得到所述chunk的有效數(shù)據(jù)占用率。
結(jié)合第二方面的第二種可能的實現(xiàn)方式,在第二方面的第四種可能的實現(xiàn)方式中,所述原位置信息中包括所述數(shù)據(jù)塊遷移前的原存儲地址和所述數(shù)據(jù)塊的長度值,所述裝置還包括:
確定模塊,用于根據(jù)所述原存儲地址和所述長度值,在所述chunk的位圖文件中確定所述數(shù)據(jù)塊占用空間對應(yīng)的至少一個數(shù)值位;若所述至少一個數(shù)值位中每一個數(shù)值位的取值均為所述第一常數(shù),則確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊。
結(jié)合第二種至第四種可能的實現(xiàn)方式,在第二方面的第五種可能的實現(xiàn)方式中,所述裝置還包括:
賦值模塊,用于若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則在將所述chunk中每一個有效數(shù)據(jù)塊均寫入分配的對應(yīng)目標(biāo)chunk后,分別將所述chunk的位圖文件中每一個數(shù)值位賦值為所述第二常數(shù)。
結(jié)合第二方面,在第二方面的第六種可能的實現(xiàn)方式中,所述查找模塊,用于在元數(shù)據(jù)樹結(jié)構(gòu)中查找存儲有所述FID的元數(shù)據(jù)節(jié)點,所述元數(shù)據(jù)節(jié)點中存儲了所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息中至少包括所述文件的FID和所述文件包含的每一個數(shù)據(jù)塊的位置信息;
其中,所述元數(shù)據(jù)樹結(jié)構(gòu)中以元數(shù)據(jù)節(jié)點形式記錄了本地存儲的全部文件的元數(shù)據(jù)信息。
第三方面,提供了一種碎片整理設(shè)備,所述設(shè)備包括:內(nèi)存和處理器,所述內(nèi)存存儲有程序代碼,所述處理器用于調(diào)用所述程序代碼,執(zhí)行以下操作:
獲取存儲器中chunk的有效數(shù)據(jù)占用率,所述chunk中存儲有數(shù)據(jù)塊及所述數(shù)據(jù)塊的元數(shù)據(jù)索引;
若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則獲取所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述元數(shù)據(jù)索引中,包括所述數(shù)據(jù)塊所屬文件的FID和所述數(shù)據(jù)塊的原位置信息;
在根據(jù)所述數(shù)據(jù)塊的原位置信息確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊后,將所述數(shù)據(jù)塊作為待遷移的數(shù)據(jù)塊,為所述數(shù)據(jù)塊分配目標(biāo)chunk,將所述數(shù)據(jù)塊遷移至所述目標(biāo)chunk;
根據(jù)所述FID,查找所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,將所述元數(shù)據(jù)信息中包含的所述數(shù)據(jù)塊遷移前的所述原位置信息更新為所述數(shù)據(jù)塊遷移后的目的位置信息。
本發(fā)明實施例提供的技術(shù)方案帶來的有益效果是:
在向chunk寫入數(shù)據(jù)時,同時會寫入數(shù)據(jù)塊的元數(shù)據(jù)索引,這樣在進(jìn)行磁盤碎片整理時,若一個chunk的有效數(shù)據(jù)占用率小于預(yù)設(shè)門限,則在對該chunk中存儲的數(shù)據(jù)塊進(jìn)行整理時,基于寫入的元數(shù)據(jù)索引可快速將數(shù)據(jù)塊遷移至目標(biāo)chunk和迅速鎖定數(shù)據(jù)塊所屬文件對應(yīng)的元數(shù)據(jù)信息,這樣根據(jù)寫入在chunk中的元數(shù)據(jù)索引作為關(guān)鍵字,可直接在存儲的海量元數(shù)據(jù)信息中快速查詢到這個數(shù)據(jù)塊的元數(shù)據(jù)信息,進(jìn)而將該元數(shù)據(jù)信息中該數(shù)據(jù)塊的位置信息進(jìn)行更新,實現(xiàn)了無需遍歷過程便可對元數(shù)據(jù)信息中數(shù)據(jù)塊的位置信息進(jìn)行修改的目的,上述磁盤碎片整理方式操作方便,大大節(jié)約了時間,提升了整理效率。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明背景技術(shù)提供的一種磁盤空間的示意圖;
圖2是本發(fā)明背景技術(shù)提供的一種元數(shù)據(jù)樹結(jié)構(gòu)的示意圖;
圖3是本發(fā)明背景技術(shù)提供的一種元數(shù)據(jù)樹結(jié)構(gòu)的示意圖;
圖4是本發(fā)明背景技術(shù)提供的一種磁盤空間的示意圖;
圖5是本發(fā)明實施例提供的一種元數(shù)據(jù)索引的存儲示意圖;
圖6是本發(fā)明實施例提供的一種元數(shù)據(jù)索引的組成示意圖;
圖7是本發(fā)明實施例提供的一種碎片整理設(shè)備的結(jié)構(gòu)示意圖;
圖8是本發(fā)明實施例提供的一種碎片整理方法的流程圖;
圖9是本發(fā)明實施例提供的一種碎片整理裝置的結(jié)構(gòu)示意圖。
具體實施方式
下面將結(jié)合附圖對本發(fā)明實施方式作進(jìn)一步地詳細(xì)描述。
在對本發(fā)明實施例進(jìn)行詳細(xì)地解釋說明之前,先對本發(fā)明實施例后續(xù)過程中可能涉及到的一些名詞進(jìn)行解釋。
chunk(分片),在本發(fā)明實例中,文件系統(tǒng)在進(jìn)行空間分配時會將磁盤按照固定大小(比如4MB大小)來劃分,即一個4MB大小的空間稱之為一個chunk。即,磁盤在邏輯上劃分成chunk,chunk可以存儲數(shù)據(jù)塊,chunk中的位置用邏輯地址描述。邏輯地址和物理地址對應(yīng),因此,邏輯地址相鄰的數(shù)據(jù)塊,在寫入磁盤后,物理地址也是相鄰的。
元數(shù)據(jù)索引,也稱之為反向索引,本發(fā)明實施例在向一個chunk寫入數(shù)據(jù)時,同時還會寫入元數(shù)據(jù)索引。其中,元數(shù)據(jù)索引中至少包括數(shù)據(jù)塊所屬文件的FID、以及該數(shù)據(jù)塊的位置信息。其中,該位置信息可包括該數(shù)據(jù)塊的存儲地址、以及該數(shù)據(jù)塊的長度值。需要說明的是,此處的存儲地址指代該數(shù)據(jù)塊的起始存儲地址。當(dāng)然,上述位置信息除了采取數(shù)據(jù)塊的存儲地址結(jié)合數(shù)據(jù)塊的長度值這種形式外,還可采取起始存儲地址結(jié)合終止存儲地址的方式,本發(fā)明實施例對此不進(jìn)行具體限定。本發(fā)明實施例僅以存儲地址結(jié)合長度值的方式進(jìn)行舉例說明。
當(dāng)一個文件較大時,通常情況下在存儲該文件時,會將該文件切分為多個部分分別存儲到多個不同的chunk中。切分得到的多個部分可分別作為一個數(shù)據(jù)塊存儲在多個不同的chunk中。其中,一個文件包含的各個數(shù)據(jù)塊可大小一致,也可不一致,本發(fā)明實施例對此不進(jìn)行具體限定。
此外,在本發(fā)明實施例中,每一個數(shù)據(jù)塊均對應(yīng)一個原位置信息和目的位置信息。其中,該數(shù)據(jù)塊遷移前的原存儲地址和該數(shù)據(jù)塊的長度值統(tǒng)稱為該數(shù)據(jù)塊的原位置信息。上述提及的原存儲地址指代該數(shù)據(jù)塊在遷移前存儲在原始chunk時的存儲地址。同理,將該數(shù)據(jù)塊遷移后的目的存儲地址和該數(shù)據(jù)塊的長度值統(tǒng)稱為該數(shù)據(jù)塊的目的位置信息。目的存儲地址指代該數(shù)據(jù)塊在遷移后存儲在目標(biāo)chunk時的存儲地址。本發(fā)明實施例僅以原存儲地址和目的存儲地址、原位置信息和目的位置信息的方式,對數(shù)據(jù)塊在進(jìn)行遷移前后的存儲位置進(jìn)行區(qū)分。
對于一個chunk中的各個數(shù)據(jù)塊,在對各個數(shù)據(jù)塊的元數(shù)據(jù)索引進(jìn)行存儲時,可采取下述幾種方式實現(xiàn):在各個數(shù)據(jù)塊之前存儲對應(yīng)的元數(shù)據(jù)索引,或者,在各個數(shù)據(jù)塊之后存儲對應(yīng)的元數(shù)據(jù)索引,或者,將各個數(shù)據(jù)塊的元數(shù)據(jù)索引統(tǒng)一存儲在該chunk的頭部,或者,將各個數(shù)據(jù)塊的元數(shù)據(jù)索引統(tǒng)一存儲在該chunk的尾部。舉例來說,圖5示出了元數(shù)據(jù)索引在chunk中的一種存儲方式。如圖5所示,在chunk中寫入元數(shù)據(jù)索引時,可在每一個數(shù)據(jù)塊的前面存儲位置分別寫入對應(yīng)的元數(shù)據(jù)索引,也即在每一個數(shù)據(jù)塊的起始存儲位置處寫入每一個數(shù)據(jù)塊的元數(shù)據(jù)索引。比如,在圖5中數(shù)據(jù)塊1的元數(shù)據(jù)索引便寫在該chunk中的起始位置處。其中,F(xiàn)ID是非負(fù)整數(shù)。打開文件或新建文件時,內(nèi)核均會返回一個文件標(biāo)識。讀寫文件也需要使用文件標(biāo)識來指定待讀寫的文件。
在本發(fā)明實施例中,可以將元數(shù)據(jù)索引集中寫在一個chunk的頭部或尾部是因為一個數(shù)據(jù)塊的元數(shù)據(jù)索引通常僅有幾十字節(jié)大小,遠(yuǎn)遠(yuǎn)低于硬盤的最小扇區(qū)大小,一般情況下最小扇區(qū)為512字節(jié)大小或者4096字節(jié)大小。所以為了避免一個扇區(qū)僅寫入一個元數(shù)據(jù)索引,進(jìn)而造成空間浪費,本發(fā)明實施例將多個數(shù)據(jù)塊的元數(shù)據(jù)索引進(jìn)行合并,例如按照圖6所示將2個數(shù)據(jù)塊的元數(shù)據(jù)索引進(jìn)行合并。其中,元數(shù)據(jù)索引的存儲采用TLV(Type Length Value,類型長度值)格式。
由于硬盤在使用一段時間后,隨著反復(fù)地文件寫入和刪除,空閑空間越來越小且常常不連續(xù),容易形成碎片,因此此時需要進(jìn)行碎片整理。其中,碎片整理過程常常會涉及到數(shù)據(jù)塊的遷移,也即對于有效數(shù)據(jù)占用率小于預(yù)設(shè)門限的chunk來說,會將該chunk中存儲的數(shù)據(jù)塊進(jìn)行遷移。在本發(fā)明實施例中,由于將每一個數(shù)據(jù)塊的元數(shù)據(jù)索引均寫入到了chunk中,所以在進(jìn)行磁盤碎片整理時,若一個chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則在遷移該chunk存儲的數(shù)據(jù)塊時,直接根據(jù)每一個數(shù)據(jù)塊的元數(shù)據(jù)索引便可以在圖2所示的元數(shù)據(jù)樹結(jié)構(gòu)(B+樹結(jié)構(gòu))中快速查找到對應(yīng)的元數(shù)據(jù)節(jié)點,并將該元數(shù)據(jù)節(jié)點中存儲的該數(shù)據(jù)塊的原存儲地址修改為遷移后的目的存儲地址。其中,該元數(shù)據(jù)節(jié)點中存儲了該數(shù)據(jù)塊所屬文件的FID和該文件包含的全部數(shù)據(jù)塊的位置信息。這樣在進(jìn)行磁盤碎片整理時,無需遍歷整個元數(shù)據(jù)樹結(jié)構(gòu),提升了碎片整理效率。
圖7是本發(fā)明實施例提供的一種碎片整理設(shè)備的結(jié)構(gòu)示意圖。參見圖7,該設(shè)備包括內(nèi)存701和處理器702,內(nèi)存701存儲有程序代碼,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
獲取存儲器中chunk的有效數(shù)據(jù)占用率,所述chunk中存儲有數(shù)據(jù)塊及所述數(shù)據(jù)塊的元數(shù)據(jù)索引;
若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則獲取所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述元數(shù)據(jù)索引中,包括所述數(shù)據(jù)塊所屬文件的FID和所述數(shù)據(jù)塊的原位置信息;
在根據(jù)所述數(shù)據(jù)塊的原位置信息確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊后,將所述數(shù)據(jù)塊作為待遷移的數(shù)據(jù)塊,為所述數(shù)據(jù)塊分配目標(biāo)chunk,將所述數(shù)據(jù)塊遷移至所述目標(biāo)chunk;
根據(jù)所述FID,查找所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,將所述元數(shù)據(jù)信息中包含的所述數(shù)據(jù)塊遷移前的所述原位置信息更新為所述數(shù)據(jù)塊遷移后的目的位置信息。
在另一個實施例中,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
基于類型長度值TLV格式,在所述目標(biāo)chunk中寫入所述目的位置信息以及所述FID,得到所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述目的位置信息包括所述數(shù)據(jù)塊的長度值、以及所述數(shù)據(jù)塊遷移后的目的存儲地址。
在另一個實施例中,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
為所述chunk設(shè)置一個位圖文件,所述位圖文件中的每一個數(shù)值位用于標(biāo)識所述chunk中對應(yīng)空間的被占用情況;
其中,當(dāng)所述位圖文件中一個數(shù)值位的取值為第一常數(shù)時,表征所述數(shù)值位指示的空間已被有效數(shù)據(jù)占用;當(dāng)所述位圖文件中一個數(shù)值位的取值為第二常數(shù)時,表征所述數(shù)值位指示的空間未被有效數(shù)據(jù)占用。
在另一個實施例中,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
統(tǒng)計所述位圖文件中取值為所述第一常數(shù)的數(shù)值位個數(shù);
獲取所述位圖文件中數(shù)值位總個數(shù);
計算所述取值為所述第一常數(shù)的數(shù)值位個數(shù)與所述數(shù)值位總個數(shù)之間的比值,得到所述chunk的有效數(shù)據(jù)占用率。
在另一個實施例中,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
根據(jù)所述原存儲地址和所述長度值,在所述chunk的位圖文件中確定所述數(shù)據(jù)塊占用空間對應(yīng)的至少一個數(shù)值位;
若所述至少一個數(shù)值位中每一個數(shù)值位的取值均為所述第一常數(shù),則確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊。
在另一個實施例中,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則在將所述chunk中每一個有效數(shù)據(jù)塊均寫入分配的對應(yīng)目標(biāo)chunk后,分別將所述chunk的位圖文件中每一個數(shù)值位賦值為所述第二常數(shù)。
在另一個實施例中,處理器702用于調(diào)用程序代碼,執(zhí)行以下操作:
在元數(shù)據(jù)樹結(jié)構(gòu)中查找存儲有所述FID的元數(shù)據(jù)節(jié)點,所述元數(shù)據(jù)節(jié)點中存儲了所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息中至少包括所述文件的FID和所述文件包含的每一個數(shù)據(jù)塊的位置信息;
其中,所述元數(shù)據(jù)樹結(jié)構(gòu)中以元數(shù)據(jù)節(jié)點形式記錄了本地存儲的全部文件的元數(shù)據(jù)信息。
本發(fā)明實施例提供的設(shè)備,在向chunk寫入數(shù)據(jù)時,同時會寫入數(shù)據(jù)塊的元數(shù)據(jù)索引,這樣在進(jìn)行磁盤碎片整理時,若一個chunk的有效數(shù)據(jù)占用率小于預(yù)設(shè)門限,則在對該chunk中存儲的數(shù)據(jù)塊進(jìn)行整理時,基于寫入的元數(shù)據(jù)索引可快速將數(shù)據(jù)塊遷移至目標(biāo)chunk和迅速鎖定數(shù)據(jù)塊所屬文件對應(yīng)的元數(shù)據(jù)信息,這樣根據(jù)寫入在chunk中的元數(shù)據(jù)索引作為關(guān)鍵字,可直接在存儲的海量元數(shù)據(jù)信息中快速查詢到這個數(shù)據(jù)塊的元數(shù)據(jù)信息,進(jìn)而將該元數(shù)據(jù)信息中該數(shù)據(jù)塊的位置信息進(jìn)行更新,實現(xiàn)了無需遍歷過程便可對元數(shù)據(jù)信息中數(shù)據(jù)塊的位置信息進(jìn)行修改的目的,上述磁盤碎片整理方式操作方便,大大節(jié)約了時間,提升了整理效率。
圖8是本發(fā)明實施例提供的一種碎片整理方法的流程圖。參見圖8,本發(fā)明實施例提供的方法流程包括:
801、周期性獲取存儲器中每一個chunk的有效數(shù)據(jù)占用率。
在本發(fā)明實施例中,硬盤的空間管理一般采用bitmap(位圖文件)來標(biāo)識chunk中的哪些空間被占用。一個chunk的有效數(shù)據(jù)占用率,指代該chunk中當(dāng)前用于存儲有效數(shù)據(jù)的空間占該chunk中全部空間的比例。其中,有效數(shù)據(jù)是相對于無效數(shù)據(jù)而言的。無效數(shù)據(jù)指代那些已經(jīng)刪除或者遷移,但卻還在占用chunk的存儲空間,未進(jìn)行空間釋放的數(shù)據(jù)。以每4KB的空間大小使用一個bit為例,則一個4MB大小的chunk需要128字節(jié)用于空間管理。遍歷每個chunk的128字節(jié)bitmap,便可以計算每個chunk的有效數(shù)據(jù)占用率,詳細(xì)過程如下。
文件系統(tǒng)會為每一個chunk均設(shè)置一個位圖文件,該位圖文件中的每一個數(shù)值位用于標(biāo)識chunk中對應(yīng)空間的被占用情況。也即,前4KB的空間占用情況用該空間字符串中的第一個數(shù)值位標(biāo)識,緊接著下4KB的空間占用情況同樣用該空間字符串中的第二個數(shù)值位標(biāo)識,依次類推,最后4KB的空間占用情況用該空間字符串中的第128*8個數(shù)值位標(biāo)識。其中,當(dāng)一個數(shù)值位的取值為第一常數(shù)(通常取值為1)時,表征該數(shù)值位指示的chunk空間已被有效數(shù)據(jù)占用;當(dāng)一個數(shù)值位的取值為第二常數(shù)(通常取值為0)時,表征該數(shù)值位指示的chunk空間未被有效數(shù)據(jù)占用。綜上,在周期性獲取每一個chunk的有效數(shù)據(jù)占用率時,通常采取下述方式實現(xiàn):
第一步、對于每一個chunk,文件系統(tǒng)會每隔預(yù)設(shè)時長統(tǒng)計一次該位圖文件中取值為1的數(shù)值位個數(shù)。
其中,預(yù)設(shè)時長的大小可為10s、20s或其他數(shù)值等,本發(fā)明實施例對預(yù)設(shè)時長的大小不進(jìn)行具體限定。
第二步、獲取該位圖文件中數(shù)值位總個數(shù)。
在本發(fā)明實施例中以每4KB的空間大小使用一個bit,每一個chunk的大小為4MB為例,則一個位圖文件中數(shù)值位總個數(shù)為128*8。
第三步、計算取值為1的數(shù)值位個數(shù)與數(shù)值位總個數(shù)之間的比值,得到該chunk的有效數(shù)據(jù)占用率。
以取值為1的數(shù)值位個數(shù)為64*8為例,則該chunk的有效數(shù)據(jù)占用率為64/128=50%。
802、判斷每一個chunk的有效數(shù)據(jù)占用率是否低于預(yù)設(shè)門限;若一個chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則執(zhí)行下述步驟803;若一個chunk的有效數(shù)據(jù)占用率高于預(yù)設(shè)門限,則對該chunk的處理流程至此結(jié)束。
其中,預(yù)設(shè)門限的大小可為10%或20%等,本發(fā)明實施例對預(yù)設(shè)門限的大小不進(jìn)行具體限定。在得到每一個chunk的有效數(shù)據(jù)占用率后,將其與上述預(yù)設(shè)門限進(jìn)行比對,便可以得到有效數(shù)據(jù)占用率低于預(yù)設(shè)門限的全部chunk。對于一個chunk來說,若其有效數(shù)據(jù)占用率小于預(yù)設(shè)門限,則證明該chunk中的空閑空間要遠(yuǎn)遠(yuǎn)大于被占用空間。這樣若存在多個有效數(shù)據(jù)占用率均小于預(yù)設(shè)門限的chunk,則會在硬盤上形成很多不連續(xù)的空閑空間。為此需要進(jìn)行碎片整理,以將磁盤碎片集中到一起,從而使得硬盤中的空閑空間盡可能連續(xù),詳細(xì)過程參見下述步驟803。
803、若一個chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則獲取該chunk中的每一個數(shù)據(jù)塊以及每一個數(shù)據(jù)塊的元數(shù)據(jù)索引。
其中,該元數(shù)據(jù)索引中至少包括該數(shù)據(jù)塊所屬文件的文件標(biāo)識、該數(shù)據(jù)塊在該chunk中進(jìn)行存儲時的原存儲地址以及該數(shù)據(jù)塊的長度值。在本發(fā)明實施例中,將該數(shù)據(jù)塊的原存儲地址和該數(shù)據(jù)塊的長度值統(tǒng)稱為該數(shù)據(jù)塊的原位置信息。其中,一個文件通常包括多個數(shù)據(jù)塊。
在本發(fā)明實施例中,若元數(shù)據(jù)索引集中存儲在chunk的頭部,則在從chunk頭部解析到每一個數(shù)據(jù)塊的元數(shù)據(jù)索引后,首先根據(jù)得到的元數(shù)據(jù)索引和上述步驟801中提及的位圖文件來判斷每一個數(shù)據(jù)塊是否為有效數(shù)據(jù)塊。判斷一個數(shù)據(jù)塊是否為有效數(shù)據(jù)塊的宗旨便是判斷用于存儲該數(shù)據(jù)塊的存儲空間當(dāng)前是否被占用;若存儲該數(shù)據(jù)塊的存儲空間當(dāng)前被占用,則表明該數(shù)據(jù)塊為有效數(shù)據(jù)塊。其中,存儲空間的占用情況,可以通過位圖文件中對應(yīng)數(shù)值位的取值來確定,詳細(xì)過程如下:
對于該chunk中的每一個數(shù)據(jù)塊,根據(jù)該數(shù)據(jù)塊的原存儲地址和長度值,在該chunk的位圖文件中確定該數(shù)據(jù)塊占用空間對應(yīng)的至少一個數(shù)值位;若該至少一個數(shù)值位中每一個數(shù)值位的取值均為1,則確定該數(shù)據(jù)塊為有效數(shù)據(jù)塊。若該至少一個數(shù)值位中存在取值為0的數(shù)值位,則確定該數(shù)據(jù)塊為已經(jīng)釋放的數(shù)據(jù)塊。
舉例來說,以數(shù)據(jù)塊的原存儲地址為chunk中8KB的存儲位置,數(shù)據(jù)塊的長度值為24KB為例,則該數(shù)據(jù)塊在該chunk中的占用空間為8KB至32KB的存儲位置,該占用空間對應(yīng)位圖文件中第3個數(shù)值位至第8個數(shù)值位。若第3個數(shù)值位至第8個數(shù)值位這5個數(shù)值位每一個的取值都為1,則證明該數(shù)據(jù)塊為有效數(shù)據(jù)塊;否則,證明該數(shù)據(jù)塊為已經(jīng)釋放的數(shù)據(jù)塊。
需要說明的是,引入元數(shù)據(jù)索引后,在刪除數(shù)據(jù)塊中存儲的數(shù)據(jù)時并不需要修改該數(shù)據(jù)塊的元數(shù)據(jù)索引,僅需修改位圖文件中對應(yīng)數(shù)值位的取值即可,所以刪除處理同未引入元數(shù)據(jù)索引之前的處理方式相同。
804、對于該chunk中的一個有效數(shù)據(jù)塊,為該有效數(shù)據(jù)塊分配目標(biāo)chunk,并將該數(shù)據(jù)塊寫入該目標(biāo)chunk,同時在該目標(biāo)chunk中寫入該數(shù)據(jù)塊的元數(shù)據(jù)索引。
在本發(fā)明實施例中,在為數(shù)據(jù)塊分配目標(biāo)chunk時可從空閑chunk中選取,也可以從當(dāng)前有效數(shù)據(jù)占用率大于預(yù)設(shè)門限的chunk中選取,本發(fā)明實施例對此不進(jìn)行具體限定。在進(jìn)行有效數(shù)據(jù)塊的遷移時,可將多個有效數(shù)據(jù)塊遷移到一個chunk中,也即各個有效數(shù)據(jù)塊之間目標(biāo)chunk可相同,也可遷移到不同的chunk中。比如,將多個有效數(shù)據(jù)塊均遷移到一個空閑chunk中。在將多個有效數(shù)據(jù)塊遷移完畢后,需要統(tǒng)計一下這個chunk當(dāng)前的有效數(shù)據(jù)占用率;若當(dāng)前的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則還需再將存儲在這個chunk中的數(shù)據(jù)塊進(jìn)行遷移。
針對遷移到空閑chunk的情況,在一個數(shù)據(jù)塊進(jìn)行遷移后,可并不立即進(jìn)行有效數(shù)據(jù)占用率的統(tǒng)計,而是等待一段時間后若還未有其他數(shù)據(jù)塊寫入,則再進(jìn)行有效數(shù)據(jù)占用率的統(tǒng)計。舉例來說,在一段時間內(nèi)若不停地有數(shù)據(jù)塊寫入一個原本空閑的chunk中,則每一次寫入數(shù)據(jù)塊后均進(jìn)行計時,若在設(shè)定的計時周期內(nèi)未再有數(shù)據(jù)塊寫入,則進(jìn)行有效數(shù)據(jù)占用率的統(tǒng)計。
每一次在新寫入數(shù)據(jù)塊后,目標(biāo)chunk的當(dāng)前寫入位置均要向后偏移,直至該目標(biāo)chunk寫滿為止。此外,在將該數(shù)據(jù)塊寫入到新分配的目標(biāo)chunk時,同時也會將該數(shù)據(jù)塊的元數(shù)據(jù)索引寫入到目標(biāo)chunk中。
需要說明的是,此時元數(shù)據(jù)索引中該數(shù)據(jù)塊的地址應(yīng)為該數(shù)據(jù)塊遷移后的目的存儲地址。需要說明的是,本發(fā)明實施例中提及的原存儲地址與該數(shù)據(jù)塊遷移前的chunk地址相關(guān),比如遷移前chunk地址為4MB的存儲位置,該數(shù)據(jù)塊在該chunk中的偏移量為1MB,則該數(shù)據(jù)塊的原存儲地址為5MB的存儲位置。目的存儲地址同樣與該數(shù)據(jù)塊遷移之后的chunk地址相關(guān),比如遷移之后chunk地址為8MB的存儲位置,該數(shù)據(jù)塊在該chunk中的偏移量同樣為1MB,則該數(shù)據(jù)塊的目的存儲地址為9MB的存儲位置。
也即,文件系統(tǒng)會獲取該數(shù)據(jù)塊的長度值、目的存儲地址以及文件標(biāo)識;基于TLV格式,將該長度值、目的存儲地址以及文件標(biāo)識寫入在目標(biāo)chunk中,完成該數(shù)據(jù)塊的元數(shù)據(jù)索引在目標(biāo)chunk中的寫入過程。
805、根據(jù)該數(shù)據(jù)塊所屬文件的文件標(biāo)識,查找該數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,將該元數(shù)據(jù)信息中包含的該數(shù)據(jù)塊的原位置信息更新為該數(shù)據(jù)塊在該目標(biāo)chunk中存儲時的目的位置信息。
在本發(fā)明實施例中,會使用圖2所示的元數(shù)據(jù)樹結(jié)構(gòu)來保存文件的元數(shù)據(jù)信息。元數(shù)據(jù)樹結(jié)構(gòu)中以元數(shù)據(jù)節(jié)點形式記錄了本地存儲的全部文件的元數(shù)據(jù)信息。其中,本地存儲的一個文件可能包括多個數(shù)據(jù)塊,而各個數(shù)據(jù)塊可能存儲在不同的chunk中。一個文件的元數(shù)據(jù)節(jié)點中會存儲該文件的元數(shù)據(jù)信息,其中元數(shù)據(jù)信息中至少包括該文件的文件標(biāo)識和該文件包含的每一個數(shù)據(jù)塊的位置信息。由于在將數(shù)據(jù)塊進(jìn)行遷移之后,元數(shù)據(jù)樹結(jié)構(gòu)中存儲的還是該數(shù)據(jù)塊遷移前的位置信息,因此需要對該數(shù)據(jù)塊的位置信息進(jìn)行更新,為此需先根據(jù)該數(shù)據(jù)塊所屬文件的文件標(biāo)識,在元數(shù)據(jù)樹結(jié)構(gòu)中鎖定存儲該文件的元數(shù)據(jù)信息的元數(shù)據(jù)節(jié)點,之后將該數(shù)據(jù)塊在遷移前的原位置信息更新為該數(shù)據(jù)塊在目標(biāo)chunk中存儲時的目的位置信息。由于本發(fā)明實施例是采取數(shù)據(jù)塊的存儲地址和數(shù)據(jù)塊的長度值方式來標(biāo)識位置信息,而在遷移前后數(shù)據(jù)塊的長度值是不會改變的,因此實質(zhì)上是對存儲地址進(jìn)行更新,也即將數(shù)據(jù)塊遷移前的原存儲地址更新為遷移后的目的存儲地址。
對于一個chunk來說,可以重復(fù)執(zhí)行上述步驟802至步驟805,直至該chunk中的全部有效數(shù)據(jù)塊均寫入新的chunk為止。需要說明的是,在將一個chunk中每一個有效數(shù)據(jù)塊均寫入分配的對應(yīng)目標(biāo)chunk后,分別將該chunk的位圖文件中每一個數(shù)值位賦值為0,表明該chunk當(dāng)前為一個空閑chunk。
本發(fā)明實施例提供的方法,在向chunk寫入數(shù)據(jù)時,同時會寫入數(shù)據(jù)塊的元數(shù)據(jù)索引,這樣在進(jìn)行磁盤碎片整理時,若一個chunk的有效數(shù)據(jù)占用率小于預(yù)設(shè)門限,則在對該chunk中存儲的數(shù)據(jù)塊進(jìn)行整理時,基于寫入的元數(shù)據(jù)索引可快速將數(shù)據(jù)塊遷移至目標(biāo)chunk和迅速鎖定數(shù)據(jù)塊所屬文件對應(yīng)的元數(shù)據(jù)信息,這樣根據(jù)寫入在chunk中的元數(shù)據(jù)索引作為關(guān)鍵字,可直接在存儲的海量元數(shù)據(jù)信息中快速查詢到這個數(shù)據(jù)塊的元數(shù)據(jù)信息,進(jìn)而將該元數(shù)據(jù)信息中該數(shù)據(jù)塊的位置信息進(jìn)行更新,實現(xiàn)了無需遍歷整個元數(shù)據(jù)樹結(jié)構(gòu)便可對元數(shù)據(jù)信息中數(shù)據(jù)塊的位置信息進(jìn)行修改的目的,上述磁盤碎片整理方式操作方便,大大節(jié)約了時間,提升了整理效率。
參見圖9,本發(fā)明實施例提供了一種碎片整理裝置,該裝置包括:
第一獲取模塊901,用于獲取存儲器中chunk的有效數(shù)據(jù)占用率,所述chunk中存儲有數(shù)據(jù)塊及所述數(shù)據(jù)塊的元數(shù)據(jù)索引;
第二獲取模塊902,用于若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則獲取所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述元數(shù)據(jù)索引中,包括所述數(shù)據(jù)塊所屬文件的FID和所述數(shù)據(jù)塊的原位置信息;
分配模塊903,用于在根據(jù)所述數(shù)據(jù)塊的原位置信息確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊后,將所述數(shù)據(jù)塊作為待遷移的數(shù)據(jù)塊,為所述數(shù)據(jù)塊分配目標(biāo)chunk,將所述數(shù)據(jù)塊遷移至所述目標(biāo)chunk;
查找模塊904,用于根據(jù)所述FID,查找所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息;
更新模塊905,用于將所述元數(shù)據(jù)信息中包含的所述數(shù)據(jù)塊遷移前的所述原位置信息更新為所述數(shù)據(jù)塊遷移后的目的位置信息。
在另一個實施例中,該裝置還包括:
寫入模塊906,用于基于類型長度值TLV格式,在所述目標(biāo)chunk中寫入所述目的位置信息以及所述FID,得到所述數(shù)據(jù)塊的元數(shù)據(jù)索引,其中,所述目的位置信息包括所述數(shù)據(jù)塊的長度值、以及所述數(shù)據(jù)塊遷移后的目的存儲地址。
在另一個實施例中,該裝置還包括:
設(shè)置模塊907,用于為所述chunk設(shè)置一個位圖文件,所述位圖文件中的每一個數(shù)值位用于標(biāo)識所述chunk中對應(yīng)空間的被占用情況;
其中,當(dāng)所述位圖文件中一個數(shù)值位的取值為第一常數(shù)時,表征所述數(shù)值位指示的空間已被有效數(shù)據(jù)占用;當(dāng)所述位圖文件中一個數(shù)值位的取值為第二常數(shù)時,表征所述數(shù)值位指示的空間未被有效數(shù)據(jù)占用。
在另一個實施例中,所述第一獲取模塊901,用于統(tǒng)計所述位圖文件中取值為所述第一常數(shù)的數(shù)值位個數(shù);獲取所述位圖文件中數(shù)值位總個數(shù);計算所述取值為所述第一常數(shù)的數(shù)值位個數(shù)與所述數(shù)值位總個數(shù)之間的比值,得到所述chunk的有效數(shù)據(jù)占用率。
在另一個實施例中,所述原位置信息中包括所述數(shù)據(jù)塊遷移前的原存儲地址和所述數(shù)據(jù)塊的長度值,該裝置還包括:
確定模塊908,用于根據(jù)所述原存儲地址和所述長度值,在所述chunk的位圖文件中確定所述數(shù)據(jù)塊占用空間對應(yīng)的至少一個數(shù)值位;若所述至少一個數(shù)值位中每一個數(shù)值位的取值均為所述第一常數(shù),則確定所述數(shù)據(jù)塊為有效數(shù)據(jù)塊。
在另一個實施例中,該裝置還包括:
賦值模塊909,用于若所述chunk的有效數(shù)據(jù)占用率低于預(yù)設(shè)門限,則在將所述chunk中每一個有效數(shù)據(jù)塊均寫入分配的對應(yīng)目標(biāo)chunk后,分別將所述chunk的位圖文件中每一個數(shù)值位賦值為所述第二常數(shù)。
在另一個實施例中,所述查找模塊904,用于在元數(shù)據(jù)樹結(jié)構(gòu)中查找存儲有所述FID的元數(shù)據(jù)節(jié)點,所述元數(shù)據(jù)節(jié)點中存儲了所述數(shù)據(jù)塊所屬文件的元數(shù)據(jù)信息,所述元數(shù)據(jù)信息中至少包括所述文件的FID和所述文件包含的每一個數(shù)據(jù)塊的位置信息;
其中,所述元數(shù)據(jù)樹結(jié)構(gòu)中以元數(shù)據(jù)節(jié)點形式記錄了本地存儲的全部文件的元數(shù)據(jù)信息。
本發(fā)明實施例提供的裝置,在向chunk寫入數(shù)據(jù)時,同時會寫入數(shù)據(jù)塊的元數(shù)據(jù)索引,這樣在進(jìn)行磁盤碎片整理時,若一個chunk的有效數(shù)據(jù)占用率小于預(yù)設(shè)門限,則在對該chunk中存儲的數(shù)據(jù)塊進(jìn)行整理時,基于寫入的元數(shù)據(jù)索引可快速將數(shù)據(jù)塊遷移至目標(biāo)chunk和迅速鎖定數(shù)據(jù)塊所屬文件對應(yīng)的元數(shù)據(jù)信息,這樣根據(jù)寫入在chunk中的元數(shù)據(jù)索引作為關(guān)鍵字,可直接在存儲的海量元數(shù)據(jù)信息中快速查詢到這個數(shù)據(jù)塊的元數(shù)據(jù)信息,進(jìn)而將該元數(shù)據(jù)信息中該數(shù)據(jù)塊的位置信息進(jìn)行更新,實現(xiàn)了無需遍歷整個元數(shù)據(jù)樹結(jié)構(gòu)便可對元數(shù)據(jù)信息中數(shù)據(jù)塊的位置信息進(jìn)行修改的目的,上述磁盤碎片整理方式操作方便,大大節(jié)約了時間,提升了整理效率。
需要說明的是:上述實施例提供的碎片整理裝置在進(jìn)行碎片整理時,僅以上述各功能模塊的劃分進(jìn)行舉例說明,實際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實施例提供的碎片整理裝置與碎片整理方法實施例屬于同一構(gòu)思,其具體實現(xiàn)過程詳見方法實施例,這里不再贅述。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計算機(jī)可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。