一種文件存儲方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明提出一種文件存儲方法,應(yīng)用于存儲設(shè)備上,包括:在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件;當(dāng)接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存;為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū);其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。通過本發(fā)明可以提升小文件的寫入性能。
【專利說明】一種文件存儲方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及視頻監(jiān)控領(lǐng)域,尤其涉及一種文件存儲方法和系統(tǒng)。
【背景技術(shù)】
[0002]隨著卡口監(jiān)控業(yè)務(wù)的快速發(fā)展,單張圖片等小文件的存儲成為了業(yè)界的一大難題。目前業(yè)界對小文件的存儲,現(xiàn)有的解決方案主要是通過文件系統(tǒng)或者云存儲方案來實現(xiàn)。
[0003]然而,通過文件系統(tǒng)對小文件進(jìn)行存儲時,長時間滿覆蓋后容易出現(xiàn)文件碎片,并且存儲的性能低下;而通過云存儲方案對小文件進(jìn)行存儲時,例如采用hadoop方案,使用集群設(shè)備或者多個副本存儲對小文件進(jìn)行存儲,仍然會存在存儲性能低下的問題,并且非常浪費存儲空間。
【發(fā)明內(nèi)容】
[0004]有鑒于此,本發(fā)明提出一種小文件存儲方法,應(yīng)用于存儲設(shè)備上,所述方法包括:
[0005]在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件;
[0006]當(dāng)接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存;
[0007]為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū);
[0008]其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。
[0009]可選的,所述小文件索引區(qū)包括目錄子區(qū)域;
[0010]所述為所述小文件指定大文件包括:
[0011]為所述小文件指定大文件;
[0012]將所述小文件的目錄信息以及指定的所述大文件的目錄信息寫入所述目錄子區(qū)域,并在目錄子區(qū)域中保存所述小文件的目錄信息與所述大文件的目錄信息的映射關(guān)系;其中所述大文件的目錄信息中包括所述大文件的目錄的訪問路徑。
[0013]可選的,所述根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件之前,包括:
[0014]將所述前端設(shè)備寫入的第一個小文件的索引信息以及所述指定的大文件的標(biāo)識寫入所述小文件索引區(qū),以便后續(xù)可根據(jù)所述第一個小文件的索引信息以及所述指定的大文件的標(biāo)識對小文件索引區(qū)中的數(shù)據(jù)進(jìn)行異常恢復(fù)。
[0015]可選的,所述小文件索引區(qū)還包括索引子區(qū)域;其中所述索引子區(qū)域包括至少一個預(yù)設(shè)大小的文件分組塊;
[0016]所述將已緩存的所述小文件的索引信息按照寫入順序批量寫入到所述小文件索引區(qū)包括:
[0017]為所述小文件分配一個文件分組塊;
[0018]將所述小文件的索引信息按照寫入順序批量寫入所述文件分組塊,并保存所述小文件與所述指定的大文件的映射關(guān)系;
[0019]當(dāng)所述文件分組塊無法再寫入新的數(shù)據(jù)時,在所述索引子區(qū)域中從所述文件分組塊的結(jié)束位置開始再次劃分出一個新的文件分組塊,將所述新的文件分組塊分配給所述小文件,并繼續(xù)將所述小文件的文件信息批量寫入所述新的文件分組塊,直到所述小文件的索引信息均寫入完成。
[0020]可選的,所述方法還包括:
[0021]在將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)的過程中,如果設(shè)備發(fā)生斷電或者重啟,在設(shè)備重啟后,根據(jù)所述小文件索引區(qū)中存儲的所述大文件的標(biāo)識以及所述第一個小文件的索引信息,查找到對應(yīng)的大文件,并遍歷該大文件,讀取該大文件中存儲的所述描述信息,根據(jù)所述描述信息對所述小文件的索引信息進(jìn)行恢復(fù)后,重新按照寫入順序批量寫入所述小文件索引區(qū)。
[0022]可選的,所述方法還包括:
[0023]當(dāng)所述已緩存的小文件的索引信息成功寫入到所述小文件索引區(qū)后,釋放已緩存的所述小文索引信息。
[0024]本發(fā)明還提出一種小文件存儲系統(tǒng),應(yīng)用于存儲設(shè)備上,所述系統(tǒng)包括:
[0025]創(chuàng)建模塊,用于在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件;
[0026]緩存模塊,用于在接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存;
[0027]寫入模塊,用于為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū);
[0028]其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。
[0029]可選的,所述小文件索引區(qū)包括目錄子區(qū)域;
[0030]所述寫入模塊具體用于:
[0031]為所述小文件指定大文件;
[0032]將所述小文件的目錄信息以及指定的所述大文件的目錄信息寫入所述目錄子區(qū)域,并在目錄子區(qū)域中保存所述小文件的目錄信息與所述大文件的目錄信息的映射關(guān)系;其中所述大文件的目錄信息中包括所述大文件的目錄的訪問路徑。
[0033]可選的,所述寫入模塊進(jìn)一步用于:
[0034]在根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件之前,將所述前端設(shè)備寫入的第一個小文件的索引信息以及所述指定的大文件的標(biāo)識寫入所述小文件索引區(qū),以便后續(xù)可根據(jù)所述第一個小文件的索引信息以及所述指定的大文件的標(biāo)識對小文件索引區(qū)中的數(shù)據(jù)進(jìn)行異?;謴?fù)。
[0035]可選的,所述小文件索引區(qū)還包括索引子區(qū)域;其中所述索引子區(qū)域包括至少一個預(yù)設(shè)大小的文件分組塊;
[0036]所述寫入模塊進(jìn)一步用于:
[0037]為所述小文件分配一個文件分組塊;
[0038]將所述小文件的索引信息按照寫入順序批量寫入所述文件分組塊,并保存所述小文件與所述指定的大文件的映射關(guān)系;
[0039]當(dāng)所述文件分組塊無法再寫入新的數(shù)據(jù)時,在所述索引子區(qū)域中從所述文件分組塊的結(jié)束位置開始再次劃分出一個新的文件分組塊,將所述新的文件分組塊分配給所述小文件,并繼續(xù)將所述小文件的文件信息批量寫入所述新的文件分組塊,直到所述小文件的索引信息均寫入完成。
[0040]可選的,所述寫入模塊進(jìn)一步用于:
[0041]在將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)的過程中,如果設(shè)備發(fā)生斷電或者重啟,在設(shè)備重啟后,根據(jù)所述小文件索引區(qū)中存儲的所述大文件的標(biāo)識以及所述第一個小文件的索引信息,查找到對應(yīng)的大文件,并遍歷該大文件,讀取該大文件中存儲的所述描述信息,根據(jù)所述描述信息對所述小文件的索引信息進(jìn)行恢復(fù)后,重新按照寫入順序批量寫入所述小文件索引區(qū)。
[0042]可選的,所述系統(tǒng)還包括:
[0043]釋放模塊,用于在所述已緩存的小文件的索引信息成功寫入到所述小文件索引區(qū)后,釋放已緩存的所述小文件的索引信息。
[0044]本發(fā)明方案通過在本地創(chuàng)建用于將前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件,在接收到前端設(shè)備寫入的小文件時,將接收到的小文件的索引信息在本地進(jìn)行緩存,然后根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入所述大文件,并在所述大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)。由于所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量,用戶可以根據(jù)所述大文件的訪問路徑以及小文件在該大文件中的開始偏移量直接在大文件上訪問小文件,因此可以實現(xiàn)將小文件映射成為大文件進(jìn)行存儲,避免了直接存儲小文件而產(chǎn)生文件碎片,并且節(jié)約了存儲空間;同時由于采用了批量寫入索引信息的方案,還可以顯著提升小文件的寫入性能。
【專利附圖】
【附圖說明】
[0045]圖1是本發(fā)明示例性的一實施方式中提出的一種文件存儲方法的流程圖;
[0046]圖2是本發(fā)明示例性的一實施方式中提出的一種小文件存儲方案示意圖;
[0047]圖3是本發(fā)明示例性的一實施方式中提出的一種小文件索引區(qū)的存儲結(jié)構(gòu)圖;
[0048]圖4是本發(fā)明示例性的一實施方式中提出的一種大文件的存儲結(jié)構(gòu)圖;
[0049]圖5是本發(fā)明示例性的一實施方式中提出的一種文件存儲系統(tǒng)的邏輯結(jié)構(gòu)圖。
【具體實施方式】
[0050]本發(fā)明旨在將前端設(shè)備寫入的小文件映射成大文件進(jìn)行存儲,并且擁有大文件的存儲性能。
[0051]本發(fā)明方案通過在本地創(chuàng)建用于將前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件,在接收到前端設(shè)備寫入的小文件時,將接收到的小文件的索引信息在本地進(jìn)行緩存,然后根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入所述大文件,并在所述大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)。由于所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量,用戶可以根據(jù)所述大文件的訪問路徑以及小文件在該大文件中的開始偏移量直接在大文件上訪問小文件,因此可以實現(xiàn)將小文件映射成為大文件進(jìn)行存儲,避免了直接存儲小文件而產(chǎn)生文件碎片,并且節(jié)約了存儲空間;同時由于采用了批量寫入索引信息的方案,還可以顯著提升小文件的寫入性能。
[0052]為了使本發(fā)明的技術(shù)方案更加清楚明白,以下結(jié)合附圖并舉實施例對本發(fā)明進(jìn)行詳細(xì)描述。
[0053]本發(fā)明示例性的一種實施方式中,提出一種文件存儲方法,應(yīng)用于存儲設(shè)備上,請參見圖1,所述方法包括:
[0054]步驟S101、在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件;
[0055]步驟S102、當(dāng)接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存;
[0056]在實現(xiàn)時,所述大文件的可以提前創(chuàng)建,也可以在接收到前端設(shè)備寫入的小文件時再出發(fā)創(chuàng)建。
[0057]步驟S103、為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū);其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。
[0058]在本實施例中,所述前端設(shè)備可以是監(jiān)控系統(tǒng)中的前端監(jiān)控設(shè)備,例如,在基于卡口監(jiān)控業(yè)務(wù)的監(jiān)控系統(tǒng)中,所述前端設(shè)備可以是該監(jiān)控系統(tǒng)中的前端卡口監(jiān)控設(shè)備(比如卡口攝像機(jī))。
[0059]請參見圖2,圖2為本實施例示出的小文件存儲方案示意圖。
[0060]如圖2所示,在整個存儲方案中,包括前端用于存儲小文件的索引數(shù)據(jù)的小文件索引區(qū),以及后端的大文件;所述大文件實際為一批小文件的集合,與前端的小文件存在映射關(guān)系。其中所述大文件可以存儲在獨立的塊存儲設(shè)備上,也可以存放在諸如現(xiàn)有實現(xiàn)中的文件系統(tǒng)或者云存儲系統(tǒng)上,在本實施例中不加以限制。
[0061]在本實施例中,所述小文件索引區(qū),用于描述小文件的索引結(jié)構(gòu),保證索引更新的性能以及索引本身的可靠性。所述小文件索引區(qū)可以被劃分出一個目錄子區(qū)域和一個索引子區(qū)域。所述目錄子區(qū)域用于存放所述小文件的目錄信息,所述索引子區(qū)域用于存放所述小文件的索引信息。
[0062]所述小文件的目錄信息,可以包括小文件的目錄名稱(即用戶的目錄名稱)、創(chuàng)建時間、父層目錄以及小文件目錄映射到所述大文件中的大文件的目錄信息;其中所述大文件的目錄信息可以包括所述大文件目錄的訪問路徑等信息;所述小文件的索引信息,可以包括小文件的名稱、文件大小、創(chuàng)建時間、父層目錄標(biāo)識、所述小文件映射后的大文件的訪問路徑、在大文件中的開始偏移量等信息。
[0063]通過以上的索引結(jié)構(gòu),可以實現(xiàn)將前端設(shè)備寫入的小文件映射為一個大文件在存儲設(shè)備上進(jìn)行存儲。用戶在查看后端存儲設(shè)備上存儲的小文件時,首先可以通過小文件與大文件之間的映射關(guān)系,來查找小文件目錄映射后的大文件目錄的訪問路徑,然后在該大文件目錄下,再根據(jù)小文件映射到所述大文件中的大文件的訪問路徑、以及在大文件中的開始偏移量等信息查找到對應(yīng)的小文件。其中所述開始偏移量用于描述小文件在映射后的大文件中的位置。
[0064]請參見圖3,圖3為本實施例示出的所述小文件索引區(qū)的存儲結(jié)構(gòu)圖。
[0065]如圖3所示,在本實施例中所述小文件索引區(qū)的存儲結(jié)構(gòu),可以沿用目前較為通用的存儲結(jié)構(gòu),主要包括super (超級塊)、Inode (索引節(jié)點)、Dir_block(目錄塊)、File-block(數(shù)據(jù)塊)等四部分。Super 用于描述 Inode、Dir-block、File-block 的開始位置和結(jié)束位置等信息。Inode用于描述Dir-block和File-block中的資源占用情況,在實現(xiàn)時,可以米用bitmap來描述Dir-block和File-block中資源的占用情況。Dir-block即為所述小文件的目錄子區(qū)域,用于存儲小文件的目錄信息;該子區(qū)域中的每一個Dir分別代表一個獨立的存儲目錄。File-block即為所述索引子區(qū)域,用于存放所述小文件的索引信息。
[0066]請繼續(xù)參見圖3,在本實施例中,為了提高小文件的寫入性能,可以通過將File-block劃分為若干個文件分組塊,并規(guī)定Dir-block中存儲的每一個小文件的目錄信息至少對應(yīng)一個文件分組塊,從而在對小文件的索引信息進(jìn)行更新時,可以以文件分組塊為單位進(jìn)行批量更新,即將小文件的索引信息寫入所述小文件索引區(qū)時,可以將同一個文件分組塊中的小文件的索引數(shù)據(jù)批量寫入小文件索引區(qū),因此當(dāng)小文件的數(shù)量足夠大時,一次索引更新的性能損失可以忽略不計,從而可以使小文件的寫入性能達(dá)到與大文件的寫入性能相當(dāng)?shù)膶崿F(xiàn)效果。
[0067]其中,值得說明的是,所述文件分組塊的大小可以由用戶結(jié)合實際的業(yè)務(wù)情況進(jìn)行設(shè)備,而所述File-block中文件分組塊的數(shù)量,則取決于文件分組塊的大小以及前端設(shè)備寫入的小文件的數(shù)量。例如,以卡口業(yè)務(wù)為例,假設(shè)前端卡口監(jiān)控設(shè)備每一小時產(chǎn)生的圖片(小文件)為100000張,所述文件分組塊的大小被設(shè)置為存儲2000個圖片索引,卡口監(jiān)控設(shè)備將每小時產(chǎn)生的圖片批量寫入后端的存儲設(shè)備時,那么本次寫入所需文件分組塊的數(shù)量則為50個。
[0068]請參見圖4,圖4為本實施例示出的所述大文件的存儲結(jié)構(gòu)圖。
[0069]如圖4所示,一個大文件實際為一批小文件的集合,與小文件存在映射關(guān)系,大文件中的每一個小文件(SF-N)包括數(shù)據(jù)部分(Data)和描述信息(Desc)兩部分,所述描述信息在實現(xiàn)時可以包括用戶文件名稱和文件大小,當(dāng)小文件索引區(qū)中存儲的小文件的索引數(shù)據(jù)發(fā)生損壞時,可以根據(jù)大文件中存儲的所述描述信息對小文件索引區(qū)中的小文件的索引數(shù)據(jù)進(jìn)行恢復(fù)。
[0070]以下以卡口業(yè)務(wù)為示例來詳細(xì)描述本方案的存儲過程。
[0071 ] 卡口業(yè)務(wù)的特點是業(yè)務(wù)的流量很大,其業(yè)務(wù)前端的卡口監(jiān)控設(shè)備可以在短時間內(nèi)產(chǎn)生大量的圖片或者圖片幀等小文件,在對業(yè)務(wù)前端產(chǎn)生的小文件進(jìn)行存儲時,通常都是通過設(shè)定一個時間周期(比如I小時),將時間周期內(nèi)采集到的小文件存放到一個獨立的存儲目錄,然后將該存儲目錄內(nèi)的小文件批量寫入后端的存儲設(shè)備上。
[0072]因此,針對卡口業(yè)務(wù)的業(yè)務(wù)特點,后端存儲設(shè)備可以將前端的卡口監(jiān)控設(shè)備批量寫入的小文件在本地進(jìn)行合并,映射成為一個大文件進(jìn)行存儲。
[0073]在實現(xiàn)時,首先可以在存儲設(shè)備本地創(chuàng)建若干用于將前端的卡口監(jiān)控設(shè)備寫入的小文件進(jìn)行合并存儲的大文件;其中每一個大文件對應(yīng)卡口監(jiān)控設(shè)備本地的一個存儲目錄;所述大文件的大小可以由用戶根據(jù)實際的業(yè)務(wù)情況進(jìn)行設(shè)置;例如,在實現(xiàn)時,為了盡可能的保證將前端設(shè)備一次寫入的小文件集合映射到同一個大文件中,可以根據(jù)大文件對應(yīng)的存儲目錄的總大小來設(shè)置大文件的大小。
[0074]存儲設(shè)備在接收到前端的卡口監(jiān)控設(shè)備寫入的小文件時,首先可以在本地建立一個事務(wù);所述事務(wù)可以為內(nèi)部定義的內(nèi)存結(jié)構(gòu),用于描述一次小文件索引批量更新的過程,即通過建立的該事務(wù)可以實現(xiàn)將小文件的索引數(shù)據(jù)批量寫入所述小文件索引區(qū)。當(dāng)事務(wù)建立完成后,可以將接收到的小文件的索引信息以及所述大文件的名稱(標(biāo)識)緩存到事務(wù)中。存儲設(shè)備在開始將前端卡口監(jiān)控設(shè)備寫入的小文件寫入大文件時,可以首先從已創(chuàng)建完成的大文件中為所述小文件指定一個大文件,然后將所述小文件的目錄信息,以及指定的所述大文件的目錄的訪問路徑等信息寫入到如圖3所示出的小文件索引結(jié)構(gòu)中的Dir-block中,并在Dir-block中保存所述小文件的目錄信息與所述大文件的目錄信息的映射關(guān)系。此時該大文件的目錄即為所述小文件的映射目錄,后續(xù)可以根據(jù)該映射關(guān)系,將所述小文件按照所述大文件的目錄的訪問路徑寫入到指定的大文件中。
[0075]當(dāng)所述大文件指定完成后,可以首先將事務(wù)中緩存的所述前端設(shè)備第一個寫入的小文件的索引信息以及該大文件的名稱寫入所述小文件索引區(qū),用于后續(xù)的異?;謴?fù)。當(dāng)寫入完成后,可以將事務(wù)中緩存的所述第一個寫入的小文件的文件索引信息以及所述大文件的名稱釋放。
[0076]接下來,可以根據(jù)寫入順序?qū)⑺銮岸嗽O(shè)備寫入的小文件以及對應(yīng)的描述信息按照圖4所示出的存儲結(jié)構(gòu)寫入所述大文件,其中所述描述信息可以包括小文件的名稱、大小等信息;當(dāng)所述大文件無法再寫入新的數(shù)據(jù)時,比如當(dāng)前大文件的大小已經(jīng)達(dá)到設(shè)定大小,可以觸發(fā)將事務(wù)中已緩存的所述小文件的索引信息按照寫入順序批量寫入到如圖3所示出的小文件索引區(qū)的索引結(jié)構(gòu)中的File-block中,以完成磁盤的更新。
[0077]然而以上方案對于一些特殊的應(yīng)用場景,會造成由于寫入持續(xù)時間太長而導(dǎo)致的磁盤更新不及時的問題,如果磁盤不及時更新,那么在寫入過程中如果發(fā)生斷電或者重啟事件,則不得不對小文件索引區(qū)中的數(shù)據(jù)重新進(jìn)行恢復(fù)。
[0078]例如,以卡口監(jiān)控設(shè)備的道路監(jiān)控場景為例,在深夜時由于道路來往車輛較少,卡口監(jiān)控設(shè)備時間周期內(nèi)(比如每小時內(nèi))采集到的圖片數(shù)量有限,因此將時間周期內(nèi)采集到的圖片批量寫入到后端存儲設(shè)備時,如果在將大文件寫滿后再觸發(fā)將小文件的索引信息寫入小文件索引區(qū),則會導(dǎo)致寫入持續(xù)時間過長,那么在這個寫入的時間段內(nèi),如果設(shè)備發(fā)生斷電或者重啟,則不得不對小文件索引區(qū)中的數(shù)據(jù)重新進(jìn)行恢復(fù)后,才能對磁盤進(jìn)行更新。
[0079]因此,針對以上場景,當(dāng)根據(jù)寫入順序?qū)⑺銮岸嗽O(shè)備寫入的小文件以及對應(yīng)的描述信息按照圖4所示出的存儲結(jié)構(gòu)寫入所述大文件時,可以設(shè)置一個超時時間,如果本次寫入持續(xù)時間達(dá)到超時時間時,可以立即觸發(fā)將事務(wù)中已緩存的所述小文件的索引信息按照寫入順序批量寫入到如圖3所示出的小文件索引區(qū)的索引結(jié)構(gòu)中的File-block中,從而可以及時的完成磁盤的更新,以減少對小文件索引區(qū)中的數(shù)據(jù)重新進(jìn)行恢復(fù)的次數(shù)。
[0080]請繼續(xù)參見圖3,在將當(dāng)前事務(wù)中緩存的小文件的索引信息批量寫入到所述小文件索引區(qū)時,假設(shè)本次寫入的小文件為目錄Dirl中的小文件,首先可以從小文件索引區(qū)的File-block中為Dirl分配一個文件分組塊FileGrpl,將該文件分組塊FileGrpl的位置信息寫入Dir-block中所述小文件的目錄Dirl中,然后將所述小文件的索引信息按照寫入順序批量寫入所述文件分組塊FileGrpl中,并保存所述小文件與所述大文件的映射關(guān)系,此時所述大文件即為所述小文件映射后的大文件。
[0081]當(dāng)然,如果本次寫入的過程中,F(xiàn)ileGrpl已達(dá)到了設(shè)定大小,無法再寫入數(shù)據(jù)時,可以在索引子區(qū)域中從所述FileGrpl的結(jié)束位置開始再次劃分出一個新的文件分組塊FileGrp2(圖3中未示出),將FileGrp2分配給Dirl,并將FileGrp2的位置信息寫入FileGrpl中,以形成一個文件分組塊的鏈表,然后繼續(xù)將所述小文件的索引信息批量寫入所述FileGrp2中,并重復(fù)以上過程,直到所述小文件的索引信息寫入完成。在本實施例中,在將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)的過程中,如果設(shè)備發(fā)生斷電或者重啟,在設(shè)備重啟后,可以根據(jù)所述小文件索引區(qū)中存儲的所述大文件的名稱以及所述第一個小文件的索引信息,查找到對應(yīng)的大文件(在實現(xiàn)時大文件可能有多個,因此通過已記錄的大文件名稱可以準(zhǔn)確查找到對應(yīng)的大文件),并遍歷該大文件,讀取該大文件中存儲的所述描述信息,然后根據(jù)所述描述信息對所述小文件的索引信息進(jìn)行恢復(fù)后,重新按照寫入順序批量寫入所述小文件索引區(qū)。
[0082]如前所述,所述索引信息可以包括小文件的名稱、文件大小、創(chuàng)建時間、父層目錄標(biāo)識、所述小文件映射后的大文件的訪問路徑、在大文件中的開始偏移量等信息。所述描述信息可以包括小文件的名稱、大小等信息。
[0083]因此,在對所述索引信息進(jìn)行恢復(fù)時,可以從小文件索引區(qū)中已經(jīng)存儲的所述第一個小文件的索引信息中直接拷貝創(chuàng)建時間、父層目錄標(biāo)識以及所述小文件映射后的大文件的訪問路徑等信息,然后根據(jù)所述描述信息恢復(fù)出用戶文件名稱和文件大小。最后,在對各小文件在大文件中的開始偏移量進(jìn)行恢復(fù)時,可以根據(jù)已經(jīng)記錄的第一個小文件的文件索引信息中的開始偏移量,并結(jié)合所述第一個小文件的實際大小進(jìn)行計算后得到。例如,假設(shè)第一個小文件的開始偏移量為0,大小為40,表明大文件中前40個字節(jié)為寫入的第一個小文件,那么在對第二個小文件的開始偏移量進(jìn)行恢復(fù)時,可以用所述第一個小文件的開始偏移量加上其實際的大小,得到第二個小文件的開始偏移量為40,此時表明大文件中從第40個字節(jié)開始為第二個小文件,依次類推,可以按順序恢復(fù)出其它各小文件的開始偏移量。當(dāng)所述小文件索引區(qū)中各小文件的索引信息成功恢復(fù)后,由于事務(wù)中緩存的索引數(shù)據(jù)在寫入完成后才會釋放,因此可以重新按照寫入順序?qū)⑹聞?wù)中緩存的索引數(shù)據(jù)批量寫入所述小文件索引區(qū)。
[0084]通過以上實施例的描述可知,本發(fā)明方案通過在本地創(chuàng)建用于將前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件,在接收到前端設(shè)備寫入的小文件時,將接收到的小文件的索引信息在本地進(jìn)行緩存,然后根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入所述大文件,并在所述大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)。由于所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量,用戶可以根據(jù)所述大文件的訪問路徑以及小文件在該大文件中的開始偏移量直接在大文件上訪問小文件,因此可以實現(xiàn)將小文件映射成為大文件進(jìn)行存儲,避免了直接存儲小文件而產(chǎn)生文件碎片,并且節(jié)約了存儲空間;同時由于采用了批量寫入索引信息的方案,還可以顯著提升小文件的寫入性能。
[0085]同時,由于小文件索引區(qū)采用了特殊的索引結(jié)構(gòu),對索引區(qū)中的文件信息劃分文件分組塊,并規(guī)定索引區(qū)中存儲的每一個小文件的目錄信息至少對應(yīng)一個文件分組塊,從而在對小文件的索引信息進(jìn)行更新時,可以以文件分組塊為單位進(jìn)行批量更新,因此可以顯著提升小文件的寫入性能,從而可以使小文件的寫入性能達(dá)到與大文件的寫入性能相當(dāng)?shù)膶崿F(xiàn)效果;而且,對索引區(qū)中的文件信息劃分文件分組塊,還可以實現(xiàn)在刪除文件索引時,只需要簡單的在前端的索引區(qū)中刪除幾個文件分組塊,并在后端刪除映射后的大文件目錄即可,整體效率較高。
[0086]另外,由于小文件在大文件中存儲時,保存了小文件的描述信息,因此一旦小文件的索引信息發(fā)生異常,可以根據(jù)小文件的描述信息進(jìn)行恢復(fù),有效保證了索引信息的安全。而且由于在大文件中小文件的描述信息和數(shù)據(jù)在一起保存,如果出現(xiàn)磁盤壞道等情況下,在對小文件進(jìn)行恢復(fù)時,正常的扇區(qū)不用依賴有壞道的扇區(qū)的數(shù)據(jù),可以單獨進(jìn)行恢復(fù)。
[0087]請參見圖5,在一種示例性的實施方式中,本發(fā)明還提出一種文件存儲系統(tǒng)50,應(yīng)用于存儲設(shè)備上,所述系統(tǒng)50包括:
[0088]創(chuàng)建模塊501,用于在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件;
[0089]緩存模塊502,用于在接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存;
[0090]寫入模塊503,用于為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū);
[0091]其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。
[0092]在本實施例中,所述小文件索引區(qū)包括目錄子區(qū)域;
[0093]所述寫入模塊503具體用于:
[0094]為所述小文件指定大文件;
[0095]將所述小文件的目錄信息以及指定的所述大文件的目錄信息寫入所述目錄子區(qū)域,并在目錄子區(qū)域中保存所述小文件的目錄信息與所述大文件的目錄信息的映射關(guān)系;其中所述大文件的目錄信息中包括所述大文件的目錄的訪問路徑。
[0096]在本實施例中,所述寫入模塊503進(jìn)一步用于:
[0097]在根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件之前,將所述前端設(shè)備寫入的第一個小文件的索引信息以及所述指定的大文件的標(biāo)識寫入所述小文件索引區(qū),以便后續(xù)可根據(jù)所述第一個小文件的索引信息以及所述指定的大文件的標(biāo)識對小文件索引區(qū)中的數(shù)據(jù)進(jìn)行異?;謴?fù)。
[0098]在本實施例中,所述小文件索引區(qū)還包括索引子區(qū)域;其中所述索引子區(qū)域包括至少一個預(yù)設(shè)大小的文件分組塊;
[0099]所述寫入模塊503進(jìn)一步用于:
[0100]為所述小文件分配一個文件分組塊;
[0101]將所述小文件的索引信息按照寫入順序批量寫入所述文件分組塊,并保存所述小文件與所述指定的大文件的映射關(guān)系;
[0102]當(dāng)所述文件分組塊無法再寫入新的數(shù)據(jù)時,在所述索引子區(qū)域中從所述文件分組塊的結(jié)束位置開始再次劃分出一個新的文件分組塊,將所述新的文件分組塊分配給所述小文件,并繼續(xù)將所述小文件的文件信息批量寫入所述新的文件分組塊,直到所述小文件的索引信息均寫入完成。
[0103]在本實施例中,所述寫入模塊503進(jìn)一步用于:
[0104]在將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)的過程中,如果設(shè)備發(fā)生斷電或者重啟,在設(shè)備重啟后,根據(jù)所述小文件索引區(qū)中存儲的所述大文件的標(biāo)識以及所述第一個小文件的索引信息,查找到對應(yīng)的大文件,并遍歷該大文件,讀取該大文件中存儲的所述描述信息,根據(jù)所述描述信息對所述小文件的索引信息進(jìn)行恢復(fù)后,重新按照寫入順序批量寫入所述小文件索引區(qū)。
[0105]在本實施例中,所述系統(tǒng)50還包括:
[0106]釋放模塊504,用于在所述已緩存的小文件的索引信息成功寫入到所述小文件索引區(qū)后,釋放已緩存的所述小文件的索引信息。
[0107]通過以上實施例的描述,本領(lǐng)域技術(shù)人員可以理解實施例中裝置中的模塊可以合并為一個模塊,也可以進(jìn)一步拆分成多個子模塊。
[0108]以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
【權(quán)利要求】
1.一種小文件存儲方法,應(yīng)用于存儲設(shè)備上,其特征在于,所述方法包括: 在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件; 當(dāng)接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存; 為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū); 其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。
2.如權(quán)利要求1所述的方法,其特征在于,所述小文件索引區(qū)包括目錄子區(qū)域; 所述為所述小文件指定大文件包括: 為所述小文件指定大文件; 將所述小文件的目錄信息以及指定的所述大文件的目錄信息寫入所述目錄子區(qū)域,并在目錄子區(qū)域中保存所述小文件的目錄信息與所述大文件的目錄信息的映射關(guān)系;其中所述大文件的目錄信息中包括所述大文件的目錄的訪問路徑。
3.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件之前,包括: 將所述前端設(shè)備寫入的第一個小文件的索引信息以及所述指定的大文件的標(biāo)識寫入所述小文件索引區(qū),以便后續(xù)可根據(jù)所述第一個小文件的索引信息以及所述指定的大文件的標(biāo)識對小文件索引區(qū)中的數(shù)據(jù)進(jìn)行異?;謴?fù)。
4.如權(quán)利要求1所述的方法,其特征在于,所述小文件索引區(qū)還包括索引子區(qū)域;其中所述索引子區(qū)域包括至少一個預(yù)設(shè)大小的文件分組塊; 所述將已緩存的所述小文件的索引信息按照寫入順序批量寫入到所述小文件索引區(qū)包括: 為所述小文件分配一個文件分組塊; 將所述小文件的索引信息按照寫入順序批量寫入所述文件分組塊,并保存所述小文件與所述指定的大文件的映射關(guān)系; 當(dāng)所述文件分組塊無法再寫入新的數(shù)據(jù)時,在所述索引子區(qū)域中從所述文件分組塊的結(jié)束位置開始再次劃分出一個新的文件分組塊,將所述新的文件分組塊分配給所述小文件,并繼續(xù)將所述小文件的文件信息批量寫入所述新的文件分組塊,直到所述小文件的索引信息均寫入完成。
5.如權(quán)利要求3所述的方法,其特征在于,所述方法還包括: 在將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)的過程中,如果設(shè)備發(fā)生斷電或者重啟,在設(shè)備重啟后,根據(jù)所述小文件索引區(qū)中存儲的所述大文件的標(biāo)識以及所述第一個小文件的索引信息,查找到對應(yīng)的大文件,并遍歷該大文件,讀取該大文件中存儲的所述描述信息,根據(jù)所述描述信息對所述小文件的索引信息進(jìn)行恢復(fù)后,重新按照寫入順序批量寫入所述小文件索引區(qū)。
6.如權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 當(dāng)所述已緩存的小文件的索引信息成功寫入到所述小文件索引區(qū)后,釋放已緩存的所述小文索引信息。
7.一種小文件存儲系統(tǒng),應(yīng)用于存儲設(shè)備上,其特征在于,所述系統(tǒng)包括: 創(chuàng)建模塊,用于在本地創(chuàng)建用于將所述前端設(shè)備寫入的小文件進(jìn)行合并存儲的大文件; 緩存模塊,用于在接收到前端設(shè)備寫入的小文件時,將所述小文件的索引信息在本地進(jìn)行緩存; 寫入模塊,用于為所述小文件指定大文件,根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件,并在該大文件無法再寫入新的數(shù)據(jù)或者寫入超時時,將已緩存的所述小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū); 其中,所述索引信息包括所述指定的大文件的訪問路徑以及所述小文件在該大文件中的開始偏移量。
8.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述小文件索引區(qū)包括目錄子區(qū)域; 所述寫入模塊具體用于: 為所述小文件指定大文件; 將所述小文件的目錄信息以及指定的所述大文件的目錄信息寫入所述目錄子區(qū)域,并在目錄子區(qū)域中保存所述小文件的目錄信息與所述大文件的目錄信息的映射關(guān)系;其中所述大文件的目錄信息中包括所述大文件的目錄的訪問路徑。
9.如權(quán)利要求7所述的方法,其特征在于,所述寫入模塊進(jìn)一步用于: 在根據(jù)寫入順序?qū)⑺鲂∥募约皩?yīng)的描述信息寫入指定的所述大文件之前,將所述前端設(shè)備寫入的第一個小文件的索引信息以及所述指定的大文件的標(biāo)識寫入所述小文件索引區(qū),以便后續(xù)可根據(jù)所述第一個小文件的索引信息以及所述指定的大文件的標(biāo)識對小文件索引區(qū)中的數(shù)據(jù)進(jìn)行異常恢復(fù)。
10.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述小文件索引區(qū)還包括索引子區(qū)域;其中所述索引子區(qū)域包括至少一個預(yù)設(shè)大小的文件分組塊; 所述寫入模塊進(jìn)一步用于: 為所述小文件分配一個文件分組塊; 將所述小文件的索引信息按照寫入順序批量寫入所述文件分組塊,并保存所述小文件與所述指定的大文件的映射關(guān)系; 當(dāng)所述文件分組塊無法再寫入新的數(shù)據(jù)時,在所述索引子區(qū)域中從所述文件分組塊的結(jié)束位置開始再次劃分出一個新的文件分組塊,將所述新的文件分組塊分配給所述小文件,并繼續(xù)將所述小文件的文件信息批量寫入所述新的文件分組塊,直到所述小文件的索引信息均寫入完成。
11.如權(quán)利要求9所述的系統(tǒng),其特征在于,所述寫入模塊進(jìn)一步用于: 在將已緩存的小文件的索引信息按照寫入順序批量寫入到小文件索引區(qū)的過程中,如果設(shè)備發(fā)生斷電或者重啟,在設(shè)備重啟后,根據(jù)所述小文件索引區(qū)中存儲的所述大文件的標(biāo)識以及所述第一個小文件的索引信息,查找到對應(yīng)的大文件,并遍歷該大文件,讀取該大文件中存儲的所述描述信息,根據(jù)所述描述信息對所述小文件的索引信息進(jìn)行恢復(fù)后,重新按照寫入順序批量寫入所述小文件索引區(qū)。
12.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括: 釋放模塊,用于在所述已緩存的小文件的索引信息成功寫入到所述小文件索引區(qū)后,釋放已緩存的所述小文件的索引信息。
【文檔編號】H04N7/18GK104462563SQ201410833341
【公開日】2015年3月25日 申請日期:2014年12月26日 優(yōu)先權(quán)日:2014年12月26日
【發(fā)明者】呂志明 申請人:浙江宇視科技有限公司