一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法
【專利摘要】本發(fā)明公開了一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法,其實施步驟分為:擴展原有的POSIX文件操作接口,新增文件切割和合并接口;這兩個擴展接口通過IOCTL的方式與操作系統(tǒng)內(nèi)核進行交互;SplitFile接口的工作流程以及MergeFile接口的工作流程。本發(fā)明給需要進行文件切割、合并的應(yīng)用帶來方便;消除了文件切割和合并過程中的拷貝開銷,這對分布式文件系統(tǒng)來說非常有效,消除了大量的I/O操作;大幅度提升了文件切割和合并這類應(yīng)用的性能。
【專利說明】一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種文件切割和合并的方法,尤其涉及一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法,屬于分布式文件系統(tǒng)和網(wǎng)絡(luò)存儲系統(tǒng)【技術(shù)領(lǐng)域】。
【背景技術(shù)】
[0002]在傳統(tǒng)的分布式文件系統(tǒng)或者本地文件系統(tǒng)中,對于文件的切割和合并都是通過數(shù)據(jù)拷貝來實現(xiàn)的?,F(xiàn)有的一些文件合并切割軟件本質(zhì)上都是通過拷貝數(shù)據(jù)來實現(xiàn)的,唯一不同的地方就是采用了多線程技術(shù),但是這并沒有從本質(zhì)上解決合并切割效率低下的問題。
[0003]比如當(dāng)用戶只需要一個文件中的部分內(nèi)容時,實際上需要進行以下的文件系統(tǒng)操作:
[0004]1、打開源文件;
[0005]2、創(chuàng)建一個新文件;
[0006]3、讀取源文件中需要的內(nèi)容,寫入到新文件中;
[0007]4、關(guān)閉源文件和新文件;
[0008]再例如當(dāng)用戶需要將幾個文件合并成一個文件時,需要進行以下的文件系統(tǒng)操作:
[0009]1、打開第一個源文件;
[0010]2、創(chuàng)建一個新文件;
[0011]3、讀取第一個源文件中的內(nèi)容,寫入到新文件中;
[0012]4、關(guān)閉第一個源文件,打開第二個源文件;
[0013]5、讀取第二個源文件的內(nèi)容,寫入到新文件中;
[0014]6、依次打開第N個源文件,讀取內(nèi)容,寫入到新文件中;
[0015]7、最后關(guān)閉新文件;
[0016]其實面對上述復(fù)雜的操作過程,一方面帶來很大的I/O開銷(I/O開銷是指:輸入輸出流量百分比),另一方面對整個這種類型的應(yīng)用產(chǎn)生了巨大開銷,從而使得該過程成了這個系統(tǒng)中的瓶頸點。
[0017]從文件系統(tǒng)的底層實現(xiàn)看,無論是文件的切割還是合并,只需要重新組織一下新文件的元數(shù)據(jù)信息,即新文件的數(shù)據(jù)塊分部信息即可,因為真正的數(shù)據(jù)信息已經(jīng)存在于存儲系統(tǒng)中了,完全可以避免掉大量的I/o開銷。為此,我們在分布式文件系統(tǒng)中提出一種新的實現(xiàn)文件切割和合并方法,從而革命性的的提高這類應(yīng)用的性能。
【發(fā)明內(nèi)容】
[0018]為了解決上述技術(shù)所存在的不足之處,本發(fā)明提供了一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法。
[0019]為了解決以上技術(shù)問題,本發(fā)明采用的技術(shù)方案是:一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法,其實施步驟如下:
[0020]1、擴展原有的POSIX文件操作接口,新增文件切割和合并接口 SplitFiIe:char*newFiIeName, char*srcFiIeName, bool changeSrcFile, uint64offset,uint641ength ;
[0021]參數(shù)說明:newFileName:切割后生成新文件的路徑
[0022]srcFileName:被切割文件的路徑
[0023]changeSrcFile:是否修改被切割文件的大小
[0024]offset:被切割文件的起始位置
[0025]length:被切割文件的切割長度
[0026]功能說明:將srcFileName文件從位置offset開始,長度為length的部分切割出來生成一個新的文件newFileName,切割后新生成的文件大小為length ;MergeFile:char*newFiIeName, bool deleteSubFile, char*subFilel, char*subFile2,char*subFile3,…;
[0027]參數(shù)說明:newFileName:合并后生成新文件的路徑
[0028]deleteSubFile:是否刪除被合并文件
[0029]subFilel:被合并文件 I
[0030]SubFile2:被合并文件 2
[0031]subFile3:被合并文件 3
[0032]功能說明:將subFilel、subFile2、subFile3等按照先后順序合并成新文件newFileName,合并后新文件的大小是這些文件的總和;
[0033]I1、這兩個擴展接口通過1CTL的方式與操作系統(tǒng)內(nèi)核進行交互;
[0034]II1、SplitFile接口的工作流程如下:
[0035]a、應(yīng)用程序調(diào)用SplitFile接口,操作系統(tǒng)打開需要切割的源文件;
[0036]b、打開成功后,通過1CTL的方式將新文件名newFileName,以及offset、length參數(shù)傳到操作系統(tǒng)內(nèi)核文件系統(tǒng)層;
[0037]C、文件系統(tǒng)層根據(jù)參數(shù),生成一個新的空文件,然后根據(jù)源文件的數(shù)據(jù)塊映射信息中中需要切割的部分的塊映射信息生成新文件的塊映射信息,根據(jù)參數(shù)如果是直接改變源文件的內(nèi)容,則修改源文件的塊映射信息,如果是不改變源文件的內(nèi)容,則將OSD中的塊映射信息引用計數(shù)加I ;
[0038]d、對于引用計數(shù)當(dāng)修改這類引用計數(shù)大于I的數(shù)據(jù)塊時采用CopyOnWrite的方式,生成新的OSD數(shù)據(jù)塊;
[0039]e、修改源文件和新文件屬性中的大小,給應(yīng)用返回成功;
[0040]IV、MergeFile接口的工作流程如下:
[0041]a、應(yīng)用程序調(diào)用MergeFile接口,先向文件系統(tǒng)中創(chuàng)建一個NewFileName的空文件;
[0042]b、創(chuàng)建成功后,通過1CTL的方式,將需要合并的文件參數(shù)發(fā)送到操作系統(tǒng)內(nèi)核文件系統(tǒng)層;
[0043]C、文件系統(tǒng)層根據(jù)需要合并的文件信息,依次獲取它們的數(shù)據(jù)塊分布信息,將這些分部信息寫入到新文件的數(shù)據(jù)快分布信息中,如果deleteSubFile為TRUE,則刪除所有的被合并文件的元數(shù)據(jù)信息;如果deleteSubFile為FALSE,則修改所有的相關(guān)OSD的數(shù)據(jù)塊映射信息,使得引用計數(shù)加I ;
[0044]d、設(shè)置新文件的大小,給應(yīng)用返回成功。
[0045]本發(fā)明的有益效果為:
[0046]1、給需要進行文件切割、合并的應(yīng)用帶來方便;
[0047]2、消除了文件切割和合并過程中的拷貝開銷,這對分布式文件系統(tǒng)來說非常有效,消除了大量的I/o操作;
[0048]3、大幅度提升了文件切割和合并這類應(yīng)用的性能。
【專利附圖】
【附圖說明】
[0049]圖1為本發(fā)明的文件切割SplitFile原理框圖。
[0050]圖2為本發(fā)明的文件合并原理框圖。
【具體實施方式】
[0051]下面結(jié)合附圖和【具體實施方式】對本發(fā)明作進一步詳細的說明。
[0052]如圖1、圖2所示,本發(fā)明提出了一種新的文件切割和合并的實現(xiàn)方法,用來提高分布式文件系統(tǒng)對這類應(yīng)用支持的效率,已達到不需要拷貝內(nèi)容的方式實現(xiàn)文件的切割和合并,本方法是基于以下幾點來實現(xiàn)的,其實施步驟如下:
[0053]1、擴展原有的POSIX文件操作接口,新增文件切割和合并接口SplitFile(char*newFiIeName, char*srcFiIeName, bool changeSrcFile, uint64offset,uint641ength);
[0054]參數(shù)說明:newFileName:切割后生成新文件的路徑
[0055]srcFileName:被切割文件的路徑
[0056]changeSrcFile:是否修改被切割文件的大小
[0057]offset:被切割文件的起始位置
[0058]length:被切割文件的切割長度
[0059]功能說明:將srcFileName文件從位置offset開始,長度為length的部分切割出來生成一個新的文件newFileName,切割后新生成的文件大小為length。MergeFile(char*newFiIeName, bool deleteSubFile, char*subFilel, char*subFile2,char*subFile3,…);
[0060]參數(shù)說明:newFileName:合并后生成新文件的路徑
[0061]deleteSubFile:是否刪除被合并文件
[0062]subFilel:被合并文件 I
[0063]subFile2:被合并文件 2
[0064]SubFile3:被合并文件 3
[0065]功能說明:將subFilel、subFile2、subFile3等按照先后順序合并成新文件newFileName,合并后新文件的大小是這些文件的總和。
[0066]2、這兩個擴展接口通過1CTL的方式與操作系統(tǒng)內(nèi)核進行交互。
[0067]3、SplitFile接口的工作流程如下:
[0068]a、應(yīng)用程序調(diào)用SplitFile接口,操作系統(tǒng)打開需要切割的源文件。
[0069]b、打開成功后,通過1CTL的方式將新文件名newFileName,以及offset、length參數(shù)傳到操作系統(tǒng)內(nèi)核文件系統(tǒng)層。
[0070]C、文件系統(tǒng)層根據(jù)參數(shù),生成一個新的空文件,然后根據(jù)源文件的數(shù)據(jù)塊映射信息中中需要切割的部分的塊映射信息生成新文件的塊映射信息,根據(jù)參數(shù)如果是直接改變源文件的內(nèi)容,則修改源文件的塊映射信息,如果是不改變源文件的內(nèi)容,則將OSD中的塊映射信息引用計數(shù)加I。
[0071]d、對于引用計數(shù)當(dāng)修改這類引用計數(shù)大于I的數(shù)據(jù)塊時采用CopyOnWrite的方式,生成新的OSD數(shù)據(jù)塊。
[0072]e、修改源文件和新文件屬性中的大小,給應(yīng)用返回成功。
[0073]4、MergeFile接口的工作流程如下:
[0074]a、應(yīng)用程序調(diào)用MergeFile接口,先向文件系統(tǒng)中創(chuàng)建一個NewFileName的空文件。
[0075]b、創(chuàng)建成功后,通過1CTL的方式,將需要合并的文件參數(shù)發(fā)送到操作系統(tǒng)內(nèi)核文件系統(tǒng)層。
[0076]C、文件系統(tǒng)層根據(jù)需要合并的文件信息,依次獲取它們的數(shù)據(jù)塊分布信息,將這些分部信息寫入到新文件的數(shù)據(jù)快分布信息中,如果deleteSubFile為TRUE,則刪除所有的被合并文件的元數(shù)據(jù)信息;如果deleteSubFile為FALSE,則修改所有的相關(guān)OSD的數(shù)據(jù)塊映射信息,使得引用計數(shù)加I。
[0077]d、設(shè)置新文件的大小,給應(yīng)用返回成功。
[0078]實施例:
[0079]如在視頻轉(zhuǎn)碼打包應(yīng)用中,利用集群對多個視頻片段進行轉(zhuǎn)碼,最終將轉(zhuǎn)碼好的多個片段再合并成一個文件,合并文件的過程本質(zhì)上就是一個拷貝過程,如果在合并過程中文件系統(tǒng)能夠提供一個快速的切割和合并的接口,會大大提供整個系統(tǒng)的效率。
[0080]實施例1:將某個大的視頻文件中,從一個1GB的視屏文件Filel中剪輯出兩個大小2GB的視頻片段且不改變原來的視頻文件Filel,一個是源文件中的0-2GB的部分File2,另一個是源文件中4-6GB的部分File3。
[0081]使用SplitFile (File2,F(xiàn)ilel,F(xiàn)ALSE,0,2GB)切割生成 File2,再調(diào)用SplitFile (File3,Filel,FALSE, 4GB,2GB)切割生成File3。通過這樣的操作大幅提高了切割性能,將原來需要幾分鐘完成的事情在一秒鐘就可以完成。
[0082]實施例2:有兩個視頻文件Filel和File2,需要合成一個視屏文件File3且不改變視頻文件Filel和File2 ;
[0083]直接使用MergeFile (File3,F(xiàn)ALSE,F(xiàn)ilel,F(xiàn)ile2)即可。
[0084]實施例3:有兩個1GB大小的視頻文件Filel和File2,需要剪輯合成一個視屏文件File3,視屏文件File3,大小為6GB,其中前面2GB來源于Filel的0-2GB,后4GB來源于File2的0-4GB,要求修改后保持原來的Filel和File2不變;
[0085]1、使用 SplitFile (subFilel, Filel, FALSE, 0,2GB)切割生成 subFilel ;
[0086]2、使用 SplitFile (subFile2, File2, FALSE, 0,4GB)切割生成 subFile2 ;
[0087]3、使用 MergeFile (File3, TRUE, subFilel, subFile2)合成生成 File3。
【權(quán)利要求】
1.一種基于重組文件元數(shù)據(jù)實現(xiàn)快速文件切割和合并的方法,其特征在于:其實施步驟如下: 1、擴展原有的POSix文件操作接口,新增文件切割和合并接口SplitFile:char*newFiIeName, char*srcFiIeName, bool changeSrcFiIe, uint64offset,uint641ength ; 參數(shù)說明:newFileName:切割后生成新文件的路徑
srcFi IeName:被切割文件的路徑
changeSrcFile:是否修改被切割文件的大小
offset:被切割文件的起始位置
length:被切割文件的切割長度 功能說明:將srcFileName文件從位置offset開始,長度為length的部分切割出來生成一個新的文件newFileName,切割后新生成的文件大小為length ;MergeFile:char*newFiIeName, bool deleteSubFile, char*subFilel, char*subFile2,char*subFile3,…; 參數(shù)說明:newFileName:合并后生成新文件的路徑
deleteSubFile:是否刪除被合并文件
subFilel:被合并文件I
subFi Ie2:被合并文件2
subFi Ie3:被合并文件3 功能說明:將subFilel、subFile2、subFile3等按照先后順序合并成新文件newFileName,合并后 新文件的大小是這些文件的總和; I1、這兩個擴展接口通過1CTL的方式與操作系統(tǒng)內(nèi)核進行交互; II1、SplitFile接口的工作流程如下: a、應(yīng)用程序調(diào)用SplitFile接口,操作系統(tǒng)打開需要切割的源文件; b、打開成功后,通過1CTL的方式將新文件名newFileName,以及offset、length參數(shù)傳到操作系統(tǒng)內(nèi)核文件系統(tǒng)層; C、文件系統(tǒng)層根據(jù)參數(shù),生成一個新的空文件,然后根據(jù)源文件的數(shù)據(jù)塊映射信息中中需要切割的部分的塊映射信息生成新文件的塊映射信息,根據(jù)參數(shù)如果是直接改變源文件的內(nèi)容,則修改源文件的塊映射信息,如果是不改變源文件的內(nèi)容,則將OSD中的塊映射信息引用計數(shù)加I ; d、對于引用計數(shù)當(dāng)修改這類引用計數(shù)大于I的數(shù)據(jù)塊時采用CopyOnWrite的方式,生成新的OSD數(shù)據(jù)塊; e、修改源文件和新文件屬性中的大小,給應(yīng)用返回成功; IV、MergeFile接口的工作流程如下: a、應(yīng)用程序調(diào)用MergeFile接口,先向文件系統(tǒng)中創(chuàng)建一個NewFileName的空文件; b、創(chuàng)建成功后,通過1CTL的方式,將需要合并的文件參數(shù)發(fā)送到操作系統(tǒng)內(nèi)核文件系統(tǒng)層; C、文件系統(tǒng)層根據(jù)需要合并的文件信息,依次獲取它們的數(shù)據(jù)塊分布信息,將這些分部信息寫入到新文件的數(shù)據(jù)快分布信息中,如果deleteSubFile為TRUE,則刪除所有的被合并文件的元數(shù)據(jù)信息;如果deleteSubFile為FALSE,則修改所有的相關(guān)OSD的數(shù)據(jù)塊映射信息,使得引用計數(shù)加I ; d、設(shè)置新文 件的大小,給應(yīng)用返回成功。
【文檔編號】G06F17/30GK104077409SQ201410332471
【公開日】2014年10月1日 申請日期:2014年7月14日 優(yōu)先權(quán)日:2014年7月14日
【發(fā)明者】丁亞軍 申請人:北京龍存科技有限責(zé)任公司