本發(fā)明涉及文件處理技術(shù)領(lǐng)域,特別是涉及一種文件存儲(chǔ)方法及裝置。
背景技術(shù):
海量小文件存儲(chǔ)出現(xiàn)后,就一直是數(shù)據(jù)存儲(chǔ)領(lǐng)域的一大難題。基于LSM tree結(jié)構(gòu)的leveldb數(shù)據(jù)庫(kù)比較適合于線上頻繁對(duì)某一些關(guān)鍵字寫入的場(chǎng)景,而我們的小文件存儲(chǔ)引擎定義的目標(biāo)在于存儲(chǔ)用戶的文件數(shù)據(jù),而文件數(shù)據(jù)的特點(diǎn)是數(shù)據(jù)在寫入以后,很少存在修改的情況,比如一張圖片存儲(chǔ)以后,要么刪除,而不會(huì)存在修改圖片里面內(nèi)容的情況。由于LSM tree有層級(jí)的概念,一條數(shù)據(jù)會(huì)被頻繁的進(jìn)行寫入和合并,那么基于leveldb數(shù)據(jù)庫(kù)這樣的LSM tree結(jié)構(gòu)就存在寫入放大的問(wèn)題。
相關(guān)技術(shù)中,存儲(chǔ)引擎是在使用的時(shí)候分配一個(gè)文件,然后操作系統(tǒng)會(huì)給對(duì)應(yīng)的文件分配索引節(jié)點(diǎn)inode信息,這個(gè)inode信息是存儲(chǔ)在內(nèi)存里面的。舉例而言,在常見(jiàn)的xfs文件系統(tǒng)下面,這個(gè)索引節(jié)點(diǎn)inode的大小是536byte,普通的文件大小是40kb,我們線上使用的是32G內(nèi)存大小、88T磁盤空間的存儲(chǔ)機(jī)型,那么在該存儲(chǔ)機(jī)型下,32G/536byte是遠(yuǎn)小于88T/40kb的,也就是說(shuō)我們無(wú)法存入如此多的文件??梢?jiàn),如何存儲(chǔ)海量小文件成為數(shù)據(jù)存儲(chǔ)領(lǐng)域亟待解決的一大問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問(wèn)題,提出了本發(fā)明以便提供一種克服上述問(wèn)題或者至少部分地解決上述問(wèn)題的文件存儲(chǔ)方法及裝置。
依據(jù)本發(fā)明的一個(gè)方面,提供了一種文件存儲(chǔ)方法,應(yīng)用于存儲(chǔ)多個(gè)小文件的存儲(chǔ)引擎,其中,所述小文件指文件所占存儲(chǔ)空間小于文件閾值,所述方法包括:
利用所述存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間;
在所述存儲(chǔ)引擎中為所述單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn);
當(dāng)所述存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持所述索引節(jié)點(diǎn)不變,將所述新的小文件寫入所述單位存儲(chǔ)空間并保存。
可選地,所述將所述新的小文件寫入所述單位存儲(chǔ)空間并保存,包括:
將所述新的小文件與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件;
當(dāng)所述合并文件所占存儲(chǔ)空間小于或等于所述單位存儲(chǔ)空間時(shí),在所述單位存儲(chǔ)空間中存儲(chǔ)所述合并文件。
可選地,所述將所述新的小文件與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,包括:
獲取所述新的小文件和所述單位存儲(chǔ)空間中已存儲(chǔ)的文件各自對(duì)應(yīng)的二進(jìn)制碼;
將所述新的小文件對(duì)應(yīng)的二進(jìn)制碼與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件對(duì)應(yīng)的二進(jìn)制碼合并在一起。
可選地,所述方法還包括:
當(dāng)所述合并文件所占存儲(chǔ)空間大于所述單位存儲(chǔ)空間時(shí),分配新的單位存儲(chǔ)空間;
將所述新的小文件寫入所述新的單位存儲(chǔ)空間并保存。
可選地,所述將所述新的小文件寫入所述單位存儲(chǔ)空間并保存,包括:
查找所述單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置;
在所述結(jié)束位置之后順序?qū)懭胨鲂碌男∥募⒈4妗?/p>
可選地,所述利用所述存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出所述單位存儲(chǔ)空間,包括:
根據(jù)所述內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間,確定所述存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目;
根據(jù)所述數(shù)目和所述存儲(chǔ)空間的總空間容量,確定所述單位存儲(chǔ)空間的空間大小;
按照所述單位存儲(chǔ)空間的空間大小,預(yù)分配出所述單位存儲(chǔ)空間。
可選地,所述方法還包括:
建立所述單位存儲(chǔ)空間的索引信息表,所述索引信息表包括所述單位存儲(chǔ)空間中已存儲(chǔ)的每個(gè)小文件在所述單位存儲(chǔ)空間中的位置信息。
可選地,所述方法還包括:
當(dāng)接收到對(duì)所述小文件的訪問(wèn)請(qǐng)求時(shí),根據(jù)所述索引信息表查詢所述小文件在所述單位存儲(chǔ)空間中的位置信息;
根據(jù)所述位置信息訪問(wèn)所述小文件。
依據(jù)本發(fā)明的另一個(gè)方面,提供了一種文件存儲(chǔ)裝置,應(yīng)用于存儲(chǔ)多個(gè)小文件的存儲(chǔ)引擎,其中,所述小文件指文件所占存儲(chǔ)空間小于文件閾值,所述裝置包括:
預(yù)分配模塊,適于利用所述存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間;
設(shè)置模塊,適于在所述存儲(chǔ)引擎中為所述單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn);
第一存儲(chǔ)模塊,適于當(dāng)所述存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持所述索引節(jié)點(diǎn)不變,將所述新的小文件寫入所述單位存儲(chǔ)空間并保存。
可選地,所述第一存儲(chǔ)模塊包括:
合并單元,適于將所述新的小文件與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件;
第一存儲(chǔ)單元,適于當(dāng)所述合并文件所占存儲(chǔ)空間小于或等于所述單位存儲(chǔ)空間時(shí),在所述單位存儲(chǔ)空間中存儲(chǔ)所述合并文件。
可選地,所述合并單元,適于獲取所述新的小文件和所述單位存儲(chǔ)空間中已存儲(chǔ)的文件各自對(duì)應(yīng)的二進(jìn)制碼;將所述新的小文件對(duì)應(yīng)的二進(jìn)制碼與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件對(duì)應(yīng)的二進(jìn)制碼合并在一起。
可選地,所述裝置還包括:
分配模塊,適于當(dāng)所述合并文件所占存儲(chǔ)空間大于所述單位存儲(chǔ)空間時(shí),分配新的單位存儲(chǔ)空間;
第二存儲(chǔ)模塊,適于將所述新的小文件寫入所述新的單位存儲(chǔ)空間并保存。
可選地,所述第一存儲(chǔ)模塊包括:
查找單元,適于查找所述單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置;
第二存儲(chǔ)單元,適于在所述結(jié)束位置之后順序?qū)懭胨鲂碌男∥募⒈4妗?/p>
可選地,所述預(yù)分配模塊包括:
第一確定單元,適于根據(jù)所述內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間,確定所述存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目;
第二確定單元,適于根據(jù)所述數(shù)目和所述存儲(chǔ)空間的總空間容量,確定所述單位存儲(chǔ)空間的空間大小;
預(yù)分配單元,適于按照所述單位存儲(chǔ)空間的空間大小,預(yù)分配出所述單位存儲(chǔ)空間。
可選地,所述裝置還包括:
建立模塊,適于建立所述單位存儲(chǔ)空間的索引信息表,所述索引信息表包括所述單位存儲(chǔ)空間中已存儲(chǔ)的每個(gè)小文件在所述單位存儲(chǔ)空間中的位置信息。
可選地,所述裝置還包括:
查詢模塊,適于當(dāng)接收到對(duì)所述小文件的訪問(wèn)請(qǐng)求時(shí),根據(jù)所述索引信息表查詢所述小文件在所述單位存儲(chǔ)空間中的位置信息;
訪問(wèn)模塊,適于根據(jù)所述位置信息訪問(wèn)所述小文件。
采用本發(fā)明實(shí)施例提供的技術(shù)方案,能夠利用存儲(chǔ)引擎在存儲(chǔ)空間中預(yù)先分配出單位存儲(chǔ)空間,并為該單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn),從而減少了磁盤空間的碎片產(chǎn)生,并且,在接收到小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持索引節(jié)點(diǎn)不變的情況下將小文件寫入單位存儲(chǔ)空間并保存,使得向存儲(chǔ)空間中寫入數(shù)據(jù)時(shí)無(wú)需修改索引節(jié)點(diǎn)中的內(nèi)容,從而減少了系統(tǒng)調(diào)用的產(chǎn)生,優(yōu)化了對(duì)磁盤IO的使用率,同時(shí),采用這種直接寫入文件的方法還能夠減少寫入放大的問(wèn)題,非常適合于存儲(chǔ)大量小文件的存儲(chǔ)引擎。
進(jìn)一步地,本發(fā)明實(shí)施例中,通過(guò)將待存儲(chǔ)的小文件和單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件,并在該單位存儲(chǔ)空間中存儲(chǔ)合并文件,實(shí)現(xiàn)了將大量的小文件合并成一個(gè)大文件進(jìn)行存儲(chǔ)的目的,從而可以有效地減少索引節(jié)點(diǎn)所占用的大小空間。
上述說(shuō)明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說(shuō)明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
根據(jù)下文結(jié)合附圖對(duì)本發(fā)明具體實(shí)施例的詳細(xì)描述,本領(lǐng)域技術(shù)人員將會(huì)更加明了本發(fā)明的上述以及其他目的、優(yōu)點(diǎn)和特征。
附圖說(shuō)明
通過(guò)閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1是根據(jù)本發(fā)明一個(gè)實(shí)施例的一種文件存儲(chǔ)方法的示意性流程圖;
圖2是根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種文件存儲(chǔ)方法的示意性流程圖;
圖3是根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種文件存儲(chǔ)方法的示意性流程圖;
圖4是根據(jù)本發(fā)明一個(gè)實(shí)施例的一種文件存儲(chǔ)方法中預(yù)分配單位存儲(chǔ)空間的示意性流程圖;
圖5是根據(jù)本發(fā)明一個(gè)實(shí)施例的一種文件存儲(chǔ)裝置的示意性框圖;
圖6是根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種文件存儲(chǔ)裝置的示意性框圖;
圖7是根據(jù)本發(fā)明另一個(gè)實(shí)施例的一種文件存儲(chǔ)裝置的示意性框圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
圖1是根據(jù)本發(fā)明一個(gè)實(shí)施例的一種文件存儲(chǔ)方法的示意性流程圖。該文件存儲(chǔ)方法應(yīng)用于存儲(chǔ)多個(gè)小文件的存儲(chǔ)引擎,其中,多個(gè)小文件可以是海量的小文件,小文件指文件所占存儲(chǔ)空間小于文件閾值(例如1M)。如圖1所示,該方法一般性地可包括步驟S101-S103:
步驟S101,利用存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間。
步驟S102,在存儲(chǔ)引擎中為單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn)。在存儲(chǔ)引擎中,每個(gè)單位存儲(chǔ)空間對(duì)應(yīng)唯一的索引節(jié)點(diǎn)。
步驟S103,當(dāng)存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持索引節(jié)點(diǎn)不變,將新的小文件寫入單位存儲(chǔ)空間并保存。
采用本發(fā)明實(shí)施例提供的技術(shù)方案,能夠利用存儲(chǔ)引擎在存儲(chǔ)空間中預(yù)先分配出單位存儲(chǔ)空間,并為該單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn),從而減少了磁盤空間的碎片產(chǎn)生,并且,在接收到小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持索引節(jié)點(diǎn)不變的情況下將小文件寫入單位存儲(chǔ)空間并保存,使得向存儲(chǔ)空間中寫入數(shù)據(jù)時(shí)無(wú)需修改索引節(jié)點(diǎn)中的內(nèi)容,從而減少了系統(tǒng)調(diào)用的產(chǎn)生,優(yōu)化了對(duì)磁盤IO的使用率,同時(shí),采用這種直接寫入文件的方法還能夠減少寫入放大的問(wèn)題,非常適合于存儲(chǔ)大量小文件的存儲(chǔ)引擎。
在一個(gè)實(shí)施例中,執(zhí)行步驟S103時(shí),將新的小文件寫入單位存儲(chǔ)空間的方式有兩種,以下依據(jù)兩種不同的寫入方式對(duì)上述文件存儲(chǔ)方法分別進(jìn)行說(shuō)明。
在一個(gè)實(shí)施例中,新的小文件采用與已存儲(chǔ)文件合并的方式寫入。如圖2所示,上述文件存儲(chǔ)方法可執(zhí)行為以下步驟S201-S207:
步驟S201,利用存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間。
步驟S202,在存儲(chǔ)引擎中為單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn)。
步驟S203,當(dāng)存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持索引節(jié)點(diǎn)不變,將新的小文件與單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件。
該步驟中,如果單位存儲(chǔ)空間中未存儲(chǔ)有文件,則直接將新的小文件寫入單位存儲(chǔ)空間。將新的小文件與單位存儲(chǔ)空間中已存儲(chǔ)的文件合并的步驟如下:首先,獲取新的小文件和單位存儲(chǔ)空間中已存儲(chǔ)的文件各自對(duì)應(yīng)的二進(jìn)制碼;其次,將新的小文件對(duì)應(yīng)的二進(jìn)制碼與單位存儲(chǔ)空間中已存儲(chǔ)的文件對(duì)應(yīng)的二進(jìn)制碼合并在一起。
步驟S204,判斷合并文件所占存儲(chǔ)空間是否小于或等于單位存儲(chǔ)空間;當(dāng)合并文件所占存儲(chǔ)空間小于或等于單位存儲(chǔ)空間時(shí),執(zhí)行步驟S205;當(dāng)合并文件所占存儲(chǔ)空間大于單位存儲(chǔ)空間時(shí),執(zhí)行步驟S206。
步驟S205,在單位存儲(chǔ)空間中存儲(chǔ)合并文件。
步驟S206,在存儲(chǔ)空間中分配新的單位存儲(chǔ)空間。分配新的單位存儲(chǔ)空間之后,需要對(duì)新的單位存儲(chǔ)空間設(shè)置新的索引節(jié)點(diǎn),即,存儲(chǔ)空間中每個(gè)單位存儲(chǔ)空間都對(duì)應(yīng)各自唯一的索引節(jié)點(diǎn),以便能根據(jù)索引節(jié)點(diǎn)和單位存儲(chǔ)空間之間的對(duì)應(yīng)關(guān)系準(zhǔn)確查找到所需文件。
步驟S207,將新的小文件寫入新的單位存儲(chǔ)空間并保存。
本實(shí)施例中,通過(guò)將待存儲(chǔ)的小文件和單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件,并在合并文件所占存儲(chǔ)空間小于或等于單位存儲(chǔ)空間時(shí)在該單位存儲(chǔ)空間中存儲(chǔ)合并文件,實(shí)現(xiàn)了將大量的小文件合并成一個(gè)大文件進(jìn)行存儲(chǔ)的目的,從而無(wú)需對(duì)每一個(gè)寫入的小文件都設(shè)置索引節(jié)點(diǎn),有效地減少了索引節(jié)點(diǎn)所占用的大小空間。
在另一個(gè)實(shí)施例中,新的小文件采用順序?qū)懭氲姆绞綄懭雴挝淮鎯?chǔ)空間中,即,首先查找單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置;然后在該結(jié)束位置之后順序?qū)懭胄碌男∥募⒈4?。?dāng)然,如果單位存儲(chǔ)空間中的空間不足以存儲(chǔ)新的小文件,則仍需重新分配新的單位存儲(chǔ)空間。因此,如圖3所示,上述文件存儲(chǔ)方法還可執(zhí)行為以下步驟S301-S307:
步驟S301,利用存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間。
步驟S302,在存儲(chǔ)引擎中為單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn)。
步驟S303,當(dāng)存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),判斷單位存儲(chǔ)空間中的剩余空間大小是否大于或等于新的小文件的大小。如果單位存儲(chǔ)空間中的剩余空間大小大于或等于新的小文件的大小,則執(zhí)行步驟S304;如果單位存儲(chǔ)空間中的剩余空間大小小于新的小文件的大小,則執(zhí)行步驟S306。
步驟S304,保持索引節(jié)點(diǎn)不變,查找單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置。
步驟S305,在最近一次寫入文件的結(jié)束位置之后順序?qū)懭胄碌男∥募⒈4妗?/p>
步驟S306,在存儲(chǔ)空間中分配新的單位存儲(chǔ)空間。與上一個(gè)實(shí)施例相同,分配新的單位存儲(chǔ)空間之后,需要對(duì)新的單位存儲(chǔ)空間設(shè)置新的索引節(jié)點(diǎn),即,存儲(chǔ)空間中每個(gè)單位存儲(chǔ)空間都對(duì)應(yīng)各自唯一的索引節(jié)點(diǎn),以便能根據(jù)索引節(jié)點(diǎn)和單位存儲(chǔ)空間之間的對(duì)應(yīng)關(guān)系準(zhǔn)確查找到所需文件。
步驟S307,將新的小文件寫入新的單位存儲(chǔ)空間并保存。
本實(shí)施例中,通過(guò)將新的小文件順序?qū)懭雴挝淮鎯?chǔ)空間,使得后續(xù)查找小文件時(shí)能夠按照寫入的順序準(zhǔn)確查找出所需文件,且該方案無(wú)需對(duì)每一個(gè)待存儲(chǔ)的小文件都設(shè)置索引節(jié)點(diǎn),從而減少了磁盤空間的碎片產(chǎn)生,且使得向存儲(chǔ)空間中寫入數(shù)據(jù)時(shí)無(wú)需修改索引節(jié)點(diǎn)中的內(nèi)容,從而減少了系統(tǒng)調(diào)用的產(chǎn)生,優(yōu)化了對(duì)磁盤IO的使用率。
上述任一實(shí)施例中,步驟S101可執(zhí)行為如圖4所示的步驟S401-S403:
步驟S401,根據(jù)內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間,確定存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目。
步驟S402,根據(jù)該數(shù)目和存儲(chǔ)空間的總空間容量,確定單位存儲(chǔ)空間的空間大小。
步驟S403,按照單位存儲(chǔ)空間的空間大小,預(yù)分配出單位存儲(chǔ)空間。
本實(shí)施例中,內(nèi)存空間的總空間容量除以每個(gè)索引節(jié)點(diǎn)的占用空間的值即為存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù);存儲(chǔ)空間的總空間容量除以該數(shù)目的值即為單位存儲(chǔ)空間的空間大小。舉例而言,存儲(chǔ)空間即磁盤空間的總空間容量為88T,內(nèi)存空間的總空間容量為32G,每個(gè)索引節(jié)點(diǎn)的占用空間為536byte,則存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目即為:32G/536byte=32*1024*1024byte/536byte=62602個(gè),因此單位存儲(chǔ)空間的空間大小即為:88T/62602個(gè)=88*1024*1024M/62602個(gè)=1.82M。也就是說(shuō),在存儲(chǔ)空間中預(yù)分配出的單位存儲(chǔ)空間的空間大小為1.82M。
由本實(shí)施例的技術(shù)方案可知,通過(guò)內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間計(jì)算出存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目,然后再根據(jù)該數(shù)目和存儲(chǔ)空間的總空間容量計(jì)算出單位存儲(chǔ)空間的空間大小,使得存儲(chǔ)空間在存儲(chǔ)多個(gè)小文件時(shí)能夠依據(jù)內(nèi)存空間中可容納的索引節(jié)點(diǎn)的數(shù)目來(lái)分配單位存儲(chǔ)空間,從而使任何存儲(chǔ)機(jī)型都能夠根據(jù)自身配置來(lái)劃分單位存儲(chǔ)空間,進(jìn)而存儲(chǔ)多個(gè)小文件,解決了數(shù)據(jù)存儲(chǔ)領(lǐng)域中目前無(wú)法存儲(chǔ)海量小文件的問(wèn)題。
在一個(gè)實(shí)施例中,上述方法還包括以下步驟:建立單位存儲(chǔ)空間的索引信息表,索引信息表包括單位存儲(chǔ)空間中已存儲(chǔ)的每個(gè)小文件在單位存儲(chǔ)空間中的位置信息。該實(shí)施例中,對(duì)每個(gè)單位存儲(chǔ)空間都建立一個(gè)索引信息表,使得每個(gè)單位存儲(chǔ)空間中存儲(chǔ)的多個(gè)小文件都有各自對(duì)應(yīng)的位置信息,從而便于利用該索引信息表從單位存儲(chǔ)空間中的大量小文件中準(zhǔn)確查找出所需的小文件。
在一個(gè)實(shí)施例中,為單位存儲(chǔ)空間建立索引信息表之后,上述方法還包括以下步驟:當(dāng)接收到對(duì)小文件的訪問(wèn)請(qǐng)求時(shí),根據(jù)索引信息表查詢小文件在單位存儲(chǔ)空間中的位置信息;根據(jù)該位置信息訪問(wèn)小文件。可見(jiàn),該實(shí)施例中,能夠根據(jù)索引信息表準(zhǔn)確查詢出每個(gè)小文件在單位存儲(chǔ)空間中的位置信息,進(jìn)而根據(jù)位置信息訪問(wèn)所需的小文件,為數(shù)據(jù)索引提供了很大的方便。
圖5是根據(jù)本發(fā)明一個(gè)實(shí)施例的一種文件存儲(chǔ)裝置的示意性框圖。該文件存儲(chǔ)裝置應(yīng)用于存儲(chǔ)多個(gè)小文件的存儲(chǔ)引擎,其中,小文件指文件所占存儲(chǔ)空間小于文件閾值。如圖5所示,該裝置包括:
預(yù)分配模塊510,適于利用存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間。
設(shè)置模塊520,與預(yù)分配模塊510相耦合,適于在存儲(chǔ)引擎中為單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn)。
第一存儲(chǔ)模塊530,與設(shè)置模塊520相耦合,適于當(dāng)存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持索引節(jié)點(diǎn)不變,將新的小文件寫入單位存儲(chǔ)空間并保存。
在一個(gè)實(shí)施例中,第一存儲(chǔ)模塊530包括:
合并單元,適于將新的小文件與單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件。
第一存儲(chǔ)單元,適于當(dāng)合并文件所占存儲(chǔ)空間小于或等于單位存儲(chǔ)空間時(shí),在單位存儲(chǔ)空間中存儲(chǔ)合并文件。
在一個(gè)實(shí)施例中,合并單元,適于獲取新的小文件和單位存儲(chǔ)空間中已存儲(chǔ)的文件各自對(duì)應(yīng)的二進(jìn)制碼;將新的小文件對(duì)應(yīng)的二進(jìn)制碼與單位存儲(chǔ)空間中已存儲(chǔ)的文件對(duì)應(yīng)的二進(jìn)制碼合并在一起。
在一個(gè)實(shí)施例中,如圖6所示,上述裝置還包括:
分配模塊540,與第一存儲(chǔ)模塊530相耦合,適于當(dāng)合并文件所占存儲(chǔ)空間大于單位存儲(chǔ)空間時(shí),分配新的單位存儲(chǔ)空間。
第二存儲(chǔ)模塊550,與分配模塊540相耦合,適于將新的小文件寫入新的單位存儲(chǔ)空間并保存。
在一個(gè)實(shí)施例中,第一存儲(chǔ)模塊530包括:
查找單元,適于查找單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置。
第二存儲(chǔ)單元,適于在結(jié)束位置之后順序?qū)懭胄碌男∥募⒈4妗?/p>
在一個(gè)實(shí)施例中,預(yù)分配模塊510包括:
第一確定單元,適于根據(jù)內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間,確定存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目。
第二確定單元,適于根據(jù)數(shù)目和存儲(chǔ)空間的總空間容量,確定單位存儲(chǔ)空間的空間大小。
預(yù)分配單元,適于按照單位存儲(chǔ)空間的空間大小,預(yù)分配出單位存儲(chǔ)空間。
在一個(gè)實(shí)施例中,如圖7所示,上述裝置還包括:
建立模塊560,與第一存儲(chǔ)模塊530相耦合,適于建立單位存儲(chǔ)空間的索引信息表,索引信息表包括單位存儲(chǔ)空間中已存儲(chǔ)的每個(gè)小文件在單位存儲(chǔ)空間中的位置信息。
查詢模塊570,與建立模塊560相耦合,適于當(dāng)接收到對(duì)小文件的訪問(wèn)請(qǐng)求時(shí),根據(jù)索引信息表查詢小文件在單位存儲(chǔ)空間中的位置信息。
訪問(wèn)模塊580,與查詢模塊570相耦合,適于根據(jù)位置信息訪問(wèn)小文件。
采用本發(fā)明實(shí)施例提供的裝置,能夠利用存儲(chǔ)引擎在存儲(chǔ)空間中預(yù)先分配出單位存儲(chǔ)空間,并為該單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn),從而減少了磁盤空間的碎片產(chǎn)生,并且,在接收到小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持索引節(jié)點(diǎn)不變的情況下將小文件寫入單位存儲(chǔ)空間并保存,使得向存儲(chǔ)空間中寫入數(shù)據(jù)時(shí)無(wú)需修改索引節(jié)點(diǎn)中的內(nèi)容,從而減少了系統(tǒng)調(diào)用的產(chǎn)生,優(yōu)化了對(duì)磁盤IO的使用率,同時(shí),采用這種直接寫入文件的方法還能夠減少寫入放大的問(wèn)題,非常適合于存儲(chǔ)大量小文件的存儲(chǔ)引擎。
本領(lǐng)域的技術(shù)人員應(yīng)可理解,圖5至圖7中的文件存儲(chǔ)裝置能夠用來(lái)實(shí)現(xiàn)前文所述的文件存儲(chǔ)方案,其中的細(xì)節(jié)描述應(yīng)與前文方法部分描述類似,為避免繁瑣,此處不另贅述。
在此處所提供的說(shuō)明書中,說(shuō)明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說(shuō)明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說(shuō),如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過(guò)程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說(shuō)明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過(guò)程或單元進(jìn)行組合。除非另外明確陳述,本說(shuō)明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來(lái)代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來(lái)使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來(lái)實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的文件存儲(chǔ)裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說(shuō)明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來(lái)實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過(guò)同一個(gè)硬件項(xiàng)來(lái)具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
至此,本領(lǐng)域技術(shù)人員應(yīng)認(rèn)識(shí)到,雖然本文已詳盡示出和描述了本發(fā)明的多個(gè)示例性實(shí)施例,但是,在不脫離本發(fā)明精神和范圍的情況下,仍可根據(jù)本發(fā)明公開的內(nèi)容直接確定或推導(dǎo)出符合本發(fā)明原理的許多其他變型或修改。因此,本發(fā)明的范圍應(yīng)被理解和認(rèn)定為覆蓋了所有這些其他變型或修改。
本發(fā)明實(shí)施例提供了A1.一種文件存儲(chǔ)方法,應(yīng)用于存儲(chǔ)多個(gè)小文件的存儲(chǔ)引擎,其中,所述小文件指文件所占存儲(chǔ)空間小于文件閾值,所述方法包括:
利用所述存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間;
在所述存儲(chǔ)引擎中為所述單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn);
當(dāng)所述存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持所述索引節(jié)點(diǎn)不變,將所述新的小文件寫入所述單位存儲(chǔ)空間并保存。
A2、根據(jù)A1所述的方法,其中,所述將所述新的小文件寫入所述單位存儲(chǔ)空間并保存,包括:
將所述新的小文件與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件;
當(dāng)所述合并文件所占存儲(chǔ)空間小于或等于所述單位存儲(chǔ)空間時(shí),在所述單位存儲(chǔ)空間中存儲(chǔ)所述合并文件。
A3、根據(jù)A2所述的方法,其中,所述將所述新的小文件與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,包括:
獲取所述新的小文件和所述單位存儲(chǔ)空間中已存儲(chǔ)的文件各自對(duì)應(yīng)的二進(jìn)制碼;
將所述新的小文件對(duì)應(yīng)的二進(jìn)制碼與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件對(duì)應(yīng)的二進(jìn)制碼合并在一起。
A4、根據(jù)A2或A3所述的方法,其中,所述方法還包括:
當(dāng)所述合并文件所占存儲(chǔ)空間大于所述單位存儲(chǔ)空間時(shí),分配新的單位存儲(chǔ)空間;
將所述新的小文件寫入所述新的單位存儲(chǔ)空間并保存。
A5、根據(jù)A1所述的方法,其中,所述將所述新的小文件寫入所述單位存儲(chǔ)空間并保存,包括:
查找所述單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置;
在所述結(jié)束位置之后順序?qū)懭胨鲂碌男∥募⒈4妗?/p>
A6、根據(jù)A1-A5任一項(xiàng)所述的方法,其中,所述利用所述存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出所述單位存儲(chǔ)空間,包括:
根據(jù)所述內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間,確定所述存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目;
根據(jù)所述數(shù)目和所述存儲(chǔ)空間的總空間容量,確定所述單位存儲(chǔ)空間的空間大??;
按照所述單位存儲(chǔ)空間的空間大小,預(yù)分配出所述單位存儲(chǔ)空間。
A7、根據(jù)A1-A6任一項(xiàng)所述的方法,其中,所述方法還包括:
建立所述單位存儲(chǔ)空間的索引信息表,所述索引信息表包括所述單位存儲(chǔ)空間中已存儲(chǔ)的每個(gè)小文件在所述單位存儲(chǔ)空間中的位置信息。
A8、根據(jù)A7所述的方法,其中,所述方法還包括:
當(dāng)接收到對(duì)所述小文件的訪問(wèn)請(qǐng)求時(shí),根據(jù)所述索引信息表查詢所述小文件在所述單位存儲(chǔ)空間中的位置信息;
根據(jù)所述位置信息訪問(wèn)所述小文件。
本發(fā)明實(shí)施例還提供了B9、一種文件存儲(chǔ)裝置,應(yīng)用于存儲(chǔ)多個(gè)小文件的存儲(chǔ)引擎,其中,所述小文件指文件所占存儲(chǔ)空間小于文件閾值,所述裝置包括:
預(yù)分配模塊,適于利用所述存儲(chǔ)引擎對(duì)存儲(chǔ)空間進(jìn)行劃分,預(yù)分配出單位存儲(chǔ)空間;
設(shè)置模塊,適于在所述存儲(chǔ)引擎中為所述單位存儲(chǔ)空間中待存儲(chǔ)的小文件設(shè)置對(duì)應(yīng)的索引節(jié)點(diǎn);
第一存儲(chǔ)模塊,適于當(dāng)所述存儲(chǔ)引擎接收到新的小文件的數(shù)據(jù)寫入請(qǐng)求時(shí),保持所述索引節(jié)點(diǎn)不變,將所述新的小文件寫入所述單位存儲(chǔ)空間并保存。
B10、根據(jù)B9所述的裝置,其中,所述第一存儲(chǔ)模塊包括:
合并單元,適于將所述新的小文件與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件合并,生成合并文件;
第一存儲(chǔ)單元,適于當(dāng)所述合并文件所占存儲(chǔ)空間小于或等于所述單位存儲(chǔ)空間時(shí),在所述單位存儲(chǔ)空間中存儲(chǔ)所述合并文件。
B11、根據(jù)B10所述的裝置,其中,所述合并單元,適于獲取所述新的小文件和所述單位存儲(chǔ)空間中已存儲(chǔ)的文件各自對(duì)應(yīng)的二進(jìn)制碼;將所述新的小文件對(duì)應(yīng)的二進(jìn)制碼與所述單位存儲(chǔ)空間中已存儲(chǔ)的文件對(duì)應(yīng)的二進(jìn)制碼合并在一起。
B12、根據(jù)B10或B11所述的裝置,其中,所述裝置還包括:
分配模塊,適于當(dāng)所述合并文件所占存儲(chǔ)空間大于所述單位存儲(chǔ)空間時(shí),分配新的單位存儲(chǔ)空間;
第二存儲(chǔ)模塊,適于將所述新的小文件寫入所述新的單位存儲(chǔ)空間并保存。
B13、根據(jù)B9所述的裝置,其中,所述第一存儲(chǔ)模塊包括:
查找單元,適于查找所述單位存儲(chǔ)空間中最近一次寫入文件的結(jié)束位置;
第二存儲(chǔ)單元,適于在所述結(jié)束位置之后順序?qū)懭胨鲂碌男∥募⒈4妗?/p>
B14、根據(jù)B9-B13任一項(xiàng)所述的裝置,其中,所述預(yù)分配模塊包括:
第一確定單元,適于根據(jù)所述內(nèi)存空間的總空間容量和每個(gè)索引節(jié)點(diǎn)的占用空間,確定所述存儲(chǔ)空間下可劃分的單位存儲(chǔ)空間的數(shù)目;
第二確定單元,適于根據(jù)所述數(shù)目和所述存儲(chǔ)空間的總空間容量,確定所述單位存儲(chǔ)空間的空間大小;
預(yù)分配單元,適于按照所述單位存儲(chǔ)空間的空間大小,預(yù)分配出所述單位存儲(chǔ)空間。
B15、根據(jù)B9-B14任一項(xiàng)所述的裝置,其中,所述裝置還包括:
建立模塊,適于建立所述單位存儲(chǔ)空間的索引信息表,所述索引信息表包括所述單位存儲(chǔ)空間中已存儲(chǔ)的每個(gè)小文件在所述單位存儲(chǔ)空間中的位置信息。
B16、根據(jù)B15所述的裝置,其中,所述裝置還包括:
查詢模塊,適于當(dāng)接收到對(duì)所述小文件的訪問(wèn)請(qǐng)求時(shí),根據(jù)所述索引信息表查詢所述小文件在所述單位存儲(chǔ)空間中的位置信息;
訪問(wèn)模塊,適于根據(jù)所述位置信息訪問(wèn)所述小文件。