一種dna讀序數(shù)據(jù)fastq文件并行壓縮和解壓縮方法
【專利摘要】一種DNA讀序數(shù)據(jù)FASTQ文件并行壓縮和并行解壓縮方法,針對DNA讀序數(shù)據(jù)FASTQ文件的壓縮與解壓縮,利用循環(huán)雙緩沖隊列、循環(huán)雙內(nèi)存映射和內(nèi)存映射并結(jié)合數(shù)據(jù)分塊處理、多線程流水并行壓縮解壓縮處理、讀寫順序二維數(shù)組等技術(shù),實現(xiàn)FASTQ文件的多個進程以及進程內(nèi)的多個線程之間的并行壓縮和并行解壓縮處理。可以基于MPI和OpenMP實現(xiàn),也可以基于MPI和Pthread實現(xiàn)。本發(fā)明充分利用各個計算節(jié)點以及節(jié)點內(nèi)多核CPU的強大計算能力,能夠解決串行壓縮解壓縮程序所受到的處理器、內(nèi)存等資源的限制。
【專利說明】—種DNA讀序數(shù)據(jù)FASTQ文件并行壓縮和解壓縮方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及生物信息、數(shù)據(jù)壓縮和高性能計算領(lǐng)域,特別涉及一種DNA讀序數(shù)據(jù)FASTQ文件的并行壓縮和并行解壓縮方法。
【背景技術(shù)】
[0002]生物信息學的主要任務(wù)之一是采集和分析大量的基因數(shù)據(jù)。這些數(shù)據(jù)對于基因研究來說至關(guān)重要,有助于確定防止或?qū)е录膊‘a(chǎn)生的基因組件,并研究出具有針對性的療法。高通量的測序方法和設(shè)備產(chǎn)生海量的短的讀序數(shù)據(jù)。存儲、管理和傳輸DNA讀序數(shù)據(jù)的常用方法是采用FASTQ文件格式,這種格式主要包含DNA讀序數(shù)據(jù)以及每個DNA堿基所對應(yīng)的注釋信息,例如表示測序標記過程的不確定性的Quality Scores信息。讀序標記和其它諸如設(shè)備名稱的描述也包含在FASTQ文件中。相比其它DNA數(shù)據(jù)的存儲格式(例如FASTA),F(xiàn)ASTQ格式能存儲更多的信息,但這同時也使得文件大小和存儲空間急劇增長。目前針對堿基讀序數(shù)據(jù)和其注釋描述信息進行有效的無損壓縮和解壓縮的算法研究,是一個研究熱點。
[0003]針對FASTQ文件數(shù)據(jù)的壓縮,目前取得重要進展的是美國轉(zhuǎn)譯遺傳研究所(TGen)所石開究的 G_SQZ算法(Tembe, W.et al.G-SQZ: compact encoding of genomic sequence andquality data.Bioinformatics2010; 26, 2192 - 2194.),以及Deorowicz Sebastian等人所石開究的 DSRC 算法(Deorowicz S, Grabowski S.Compression of DNA sequence reads inFASTQ format.Bioinformatics2011; 27:860-862.)。這兩種算法均使用了索引系統(tǒng)允許從規(guī)律的間隔處(簡稱分塊)進行訪問,所需信息不需要從頭開始解碼。G_SQZ算法主要使用Huffman編碼〈堿基,Quality score〉對,而DSRC算法對堿基數(shù)據(jù)行和Quality Score行單獨利用Huffman編碼并輔以其它精細的壓縮處理(例如游程處理等)。這類方法的優(yōu)點是保留數(shù)據(jù)相對順序信息的同時能夠隨機解碼部分數(shù)據(jù)進行訪問,無損壓縮效率高。這代表了一類FASTQ文件壓縮方法,為方便敘述,以下簡稱為分塊索引串行算法。
[0004]目前需要進行基因組序列分析的數(shù)據(jù)已達到TB數(shù)量級。大型測序中心正計劃或已安裝PB級規(guī)模的存儲設(shè)備。對于這些海量數(shù)據(jù),為減少存儲空間和傳輸時間,便于對大量基因組序列數(shù)據(jù)實時分析,必須對其進行實時數(shù)據(jù)壓縮和解壓縮,這需要借助高性能計算平臺的強大的計算能力。隨著高性能計算平臺的快速發(fā)展,充分利用各個計算節(jié)點上的多核CPU的強大的計算能力,來實時壓縮與解壓縮海量的大的FASTQ文件,能夠解決串行壓縮解壓縮程序所受到的處理器處理能力、內(nèi)存等資源的限制。
[0005]上述G-SQZ算法和DSRC算法均是串行算法,目如尚未見到與這類算法相關(guān)的基于多節(jié)點的多核CPU的并行算法的研究文章和專利。
【發(fā)明內(nèi)容】
[0006]鑒于目前尚未見到與上述G-SQZ和DSRC等這一類分塊索引串行算法相關(guān)的并行算法的研究與專利,本發(fā)明的目的在于提供一種這一類FASTQ文件分塊索引串行壓縮解壓縮算法對應(yīng)的并行壓縮解壓縮方法,利用多計算節(jié)點和多核CPU,可以基于MPI+OpenMP實現(xiàn),也可以基于MPI+Pthread實現(xiàn);能夠充分利用高性能計算平臺的強大的計算能力,大幅度提升對海量基因組序列實時分析處理的速度,對基因數(shù)據(jù)的更廣泛應(yīng)用提供重要的技術(shù)基礎(chǔ)。
[0007]本發(fā)明的技術(shù)方案如下所述。
[0008]一種DNA讀序數(shù)據(jù)的FASTQ文件的并行壓縮方法,包括以下步驟:
[0009]一、并行壓縮進程任務(wù)分割
[0010]根據(jù)FASTQ文件大小、并行壓縮進程數(shù)目、FASTQ文件中每個讀序片段(包含堿基信息以及對應(yīng)的其它注釋信息,以下為敘述方便,標記為一條記錄)數(shù)據(jù)的特點確定每個進程待處理數(shù)據(jù)的起始和結(jié)束位置。每個進程均運行進程任務(wù)分割模塊,將待壓縮的原始數(shù)據(jù)近似均勻地分配到各個進程上,以實現(xiàn)數(shù)據(jù)并行。這樣每個進程在處理時相互之間沒有通信時間的消耗,提升了數(shù)據(jù)并行的處理效率。每個進程得到單獨的壓縮文件,壓縮數(shù)據(jù)的順序與進程號一致。
[0011]二、并行壓縮進程內(nèi)多線程流水并行壓縮
[0012]進程處理模塊中包含一個原始數(shù)據(jù)讀取線程、一個壓縮數(shù)據(jù)寫入線程和多個壓縮工作線程,工作線程的具體數(shù)目可以根據(jù)硬件CPU的核數(shù)以及進程設(shè)置來設(shè)定。
[0013]每個進程所處理的數(shù)據(jù)被原始數(shù)據(jù)讀取線程分成多個塊,每個塊包含特定的固定數(shù)目的記錄數(shù)據(jù)(最末端塊可能少于這個固定數(shù)目)。
[0014]每個工作線程均有兩個循環(huán)雙緩沖隊列,一個是原始數(shù)據(jù)循環(huán)雙緩沖隊列,一個是壓縮數(shù)據(jù)循環(huán)雙緩沖隊列。原始數(shù)據(jù)循環(huán)雙緩沖隊列和壓縮數(shù)據(jù)循環(huán)雙緩沖隊列具有類似結(jié)構(gòu),其中緩沖區(qū)的結(jié)構(gòu)根據(jù)存儲數(shù)據(jù)的不同稍有不同,后面在【具體實施方式】部分詳細介紹各個緩沖區(qū)的結(jié)構(gòu)。每個原始數(shù)據(jù)循環(huán)雙緩沖隊列包含兩個隊列:一個是空塊緩沖區(qū)隊列,一個是原始數(shù)據(jù)塊隊列。每個壓縮數(shù)據(jù)循環(huán)雙緩沖隊列也包含兩個隊列:一個是空塊緩沖區(qū)隊列,一個是壓縮數(shù)據(jù)塊隊列。這兩個循環(huán)雙緩沖隊列的處理方式相同。
[0015]下面以原始數(shù)據(jù)循環(huán)雙緩沖隊列為例,詳細說明其處理方式:
[0016](I)原始數(shù)據(jù)循環(huán)雙緩沖隊列初始化處理:將空塊緩沖區(qū)隊列實例化,具有特定數(shù)目的空塊緩沖區(qū),原始數(shù)據(jù)塊隊列為空。
[0017](2)原始數(shù)據(jù)讀取線程讀取一個原始數(shù)據(jù)塊。
[0018](3)在空塊緩沖區(qū)隊列頭獲取一個空塊緩沖區(qū)。
[0019](4)用原始數(shù)據(jù)塊填充獲取的這個空塊緩沖區(qū)。
[0020](5)將這個填充的原始數(shù)據(jù)塊放入原始數(shù)據(jù)塊隊列的末端。
[0021](6)壓縮工作線程在原始數(shù)據(jù)塊隊列頭中獲取一個原始數(shù)據(jù)塊緩沖區(qū)中的塊數(shù)據(jù)進行壓縮處理。
[0022](7)將此原始數(shù)據(jù)塊緩沖區(qū)清空,并放入空塊緩沖區(qū)隊列。
[0023]在每個進程內(nèi),進行以原始數(shù)據(jù)塊為單位的數(shù)據(jù)的并行壓縮流水線處理,具體流水并行處理流程如下:
[0024](I)原始數(shù)據(jù)讀取線程不斷地根據(jù)記錄數(shù)據(jù)特點解析讀取原始數(shù)據(jù)塊,循環(huán)依次查找每個壓縮工作線程的原始數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū),找到后將原始數(shù)據(jù)塊放入,然后釋放此塊緩沖區(qū)到此循環(huán)雙緩沖隊列中的原始數(shù)據(jù)塊隊列的末端。[0025](2)每個壓縮工作線程不斷地從本線程的原始數(shù)據(jù)循環(huán)雙緩沖隊列中的原始數(shù)據(jù)塊隊列頭獲取原始數(shù)據(jù)塊,然后進行壓縮處理。
[0026](3)每個壓縮工作線程不斷地將壓縮后的塊數(shù)據(jù)填充到獲取的本線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū)中,并釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列的壓縮數(shù)據(jù)塊隊列的尾部。
[0027](4)壓縮數(shù)據(jù)寫入線程不斷地按照塊號從小到大的順序依次查找已經(jīng)壓縮處理完畢的塊數(shù)據(jù)所在的線程號,獲取此線程內(nèi)的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列頭中的此塊壓縮數(shù)據(jù),寫入最終的壓縮文件。
[0028]上述各個線程的具體算法以及結(jié)束條件詳見【具體實施方式】部分。
[0029]原始數(shù)據(jù)讀取線程中,采用內(nèi)存映射技術(shù)結(jié)合FASTQ數(shù)據(jù)分塊技術(shù)來提高大數(shù)據(jù)文件的讀取速度。結(jié)合DNA讀序片段信息的分塊,根據(jù)內(nèi)存頁面大小以及映射的空間大小,計算每個塊的數(shù)據(jù)在內(nèi)存映射空間的位置,以及何時進行內(nèi)存映射空間的釋放和重新映射。采用內(nèi)存映射一個很明顯的好處就是:進程可以直接讀寫內(nèi)存,基本上不需要任何額外的數(shù)據(jù)拷貝.而對于像fread/fwrite之類的文件1/0,則需要在內(nèi)核空間和用戶空間之間進行四次數(shù)據(jù)拷貝,而內(nèi)存映射只需要兩次拷貝:一次是從輸入文件拷貝到內(nèi)存映射區(qū),另外一次是從內(nèi)存映射區(qū)拷貝到輸出文件中。實際上,進程可以像訪問內(nèi)存一樣對普通文件進行操作。此技術(shù)的詳細說明見具體實施部分。
[0030]壓縮數(shù)據(jù)寫入線程中,每個塊壓縮后寫入最終壓縮文件的順序需要與原始數(shù)據(jù)讀取線程中原始數(shù)據(jù)塊的讀取順序相同,在此使用一個讀寫順序二維數(shù)組。二維數(shù)組的第一維即表示塊號;第二維的大小為2,分別記錄每個塊分配的線程號以及壓縮處理完畢標志信息,
[0031]每個進程得到的壓縮文件起始為文件頭,包含設(shè)置信息,譬如塊所包含的記錄數(shù)目。緊接著是按照原始數(shù)據(jù)塊順序的各個塊的壓縮后數(shù)據(jù)。文件最后是文件尾部數(shù)據(jù),包含每個塊的壓縮數(shù)據(jù)在文件中的位置索引信息、塊數(shù),以及文件尾部在整個文件中的位置信息。這些信息用于并行解碼,以及隨機訪問特定塊時僅解碼部分數(shù)據(jù),無需解碼整個文件。
[0032]一種DNA讀序數(shù)據(jù)FASTQ文件的并行解壓縮方法,包括以下步驟:
[0033]一、根據(jù)進程號確定進程處理的壓縮文件
[0034]待壓縮的FASTQ文件根據(jù)設(shè)置的并行壓縮進程的數(shù)目得到相應(yīng)數(shù)目的壓縮文件。在解壓縮中,根據(jù)壓縮文件的數(shù)目設(shè)置并行解壓縮進程的數(shù)目,各個解壓縮進程得到的解壓縮文件的順序由壓縮文件的順序決定。每個解壓縮進程在處理時相互之間沒有通信時間的消耗,提升了數(shù)據(jù)并行的處理效率。
[0035]二、讀取壓縮文件尾部,獲取塊設(shè)置、塊索引和塊數(shù)等信息
[0036]區(qū)別于并行壓縮方法的是,并行解壓縮方法在每個進程初始從壓縮文件的尾部獲得塊包含的記錄數(shù)目的設(shè)置、每個塊在壓縮文件中的位置等索引、塊的數(shù)目等信息,這些信息使得并行解壓縮方法區(qū)別于并行壓縮方法。
[0037]三、并行解壓縮進程內(nèi)多線程流水并行解壓縮
[0038]同并行壓縮方法類似,并行解壓縮方法的解壓縮進程處理模塊中包含一個壓縮數(shù)據(jù)讀取線程、一個解壓縮數(shù)據(jù)寫入線程和多個解壓縮工作線程,工作線程的具體數(shù)目可以根據(jù)硬件CPU的核數(shù)以及進程設(shè)置來設(shè)定。[0039]每個解壓縮工作線程有兩個循環(huán)雙緩沖隊列,一個是壓縮數(shù)據(jù)循環(huán)雙緩沖隊列,一個是解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列。壓縮數(shù)據(jù)循環(huán)雙緩沖隊列和解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列具有類似結(jié)構(gòu),其中緩沖區(qū)的結(jié)構(gòu)根據(jù)存儲數(shù)據(jù)的不同稍有不同,后面在【具體實施方式】部分詳細介紹各個緩沖區(qū)的結(jié)構(gòu)。每個壓縮數(shù)據(jù)循環(huán)雙緩沖隊列包含兩個隊列:一個是空塊緩沖區(qū)隊列,一個是壓縮數(shù)據(jù)塊隊列。每個解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列也包含兩個隊列:一個是空塊緩沖區(qū)隊列,一個是解壓縮數(shù)據(jù)塊隊列。這兩個循環(huán)雙緩沖隊列的處理方式均與前述的并行壓縮方法中的原始數(shù)據(jù)循環(huán)雙緩沖隊列處理方式相同,不再贅述。
[0040]在每個進程內(nèi),進行以讀序數(shù)據(jù)壓縮塊為單位的數(shù)據(jù)的并行解壓縮流水線處理,具體并行流水處理流程如下:
[0041](I)壓縮數(shù)據(jù)讀取線程根據(jù)文件尾部得到的壓縮塊的位置索引信息,按照塊號從小到大的順序,不斷地讀取已知壓縮大小的壓縮塊,循環(huán)依次查找每個解壓縮工作線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列頭的空塊緩沖區(qū),找到后將壓縮塊數(shù)據(jù)放入,并釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列的末端。
[0042]( 2)每個解壓縮工作線程不斷地從本線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列頭獲取壓縮數(shù)據(jù)塊,然后進行解壓縮處理。
[0043](3)每個解壓縮工作線程不斷地將解壓縮后的塊數(shù)據(jù)填充到獲取的本線程的解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū)中,并釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列的解壓縮數(shù)據(jù)塊隊列尾部。
[0044](4)解壓縮數(shù)據(jù)寫入線程不斷地按照塊號從小到大的順序依次查找已經(jīng)壓縮處理完畢的塊數(shù)據(jù)所在的線程號,獲取此線程內(nèi)的解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的解壓縮數(shù)據(jù)塊隊列頭的此塊解壓縮數(shù)據(jù),寫入最終的壓縮文件。
[0045]上述各個線程的具體算法以及結(jié)束條件詳見【具體實施方式】部分。
[0046]壓縮數(shù)據(jù)讀取線程采用循環(huán)雙內(nèi)存映射技術(shù)結(jié)合數(shù)據(jù)分塊技術(shù)來提高大數(shù)據(jù)文件的讀取速度。其中關(guān)鍵技術(shù)是循環(huán)雙內(nèi)存映射技術(shù),使得解壓縮工作線程讀取壓縮數(shù)據(jù)進行解壓縮和壓縮數(shù)據(jù)讀取線程內(nèi)存映射并行執(zhí)行。即具有兩個內(nèi)存映射一內(nèi)存映射I和內(nèi)存映射2,按照壓縮塊的順序依次循環(huán)放入這兩個內(nèi)存映射中。根據(jù)壓縮文件尾部的壓縮塊數(shù)據(jù)位置索引信息,以及兩個內(nèi)存映射空間的大小,按照塊號從小到大的順序,依次計算每個壓縮塊數(shù)據(jù)所在的內(nèi)存映射緩沖區(qū)以及在內(nèi)存映射緩沖區(qū)內(nèi)的位置信息。解壓縮工作線程直接在壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中使用此循環(huán)雙內(nèi)存映射區(qū)域,以減少數(shù)據(jù)拷貝次數(shù)。對于正在使用的內(nèi)存映射,需要等待此內(nèi)存映射的前一次映射數(shù)據(jù)被所有解壓縮工作線程使用完畢后,才能重新進行內(nèi)存映射。此技術(shù)的詳細說明見【具體實施方式】部分。
[0047]解壓縮數(shù)據(jù)寫入線程中,每個塊解壓縮后寫入最終解壓縮文件的順序需要與壓縮數(shù)據(jù)讀取線程中壓縮塊的讀取順序相同。與并行壓縮方法相同,在此也使用一個相同的讀寫順序二維數(shù)組來記錄每個塊分配的線程號以及解壓縮處理完畢標志信息。
[0048]為提高I/O速度,解壓縮數(shù)據(jù)寫入線程也使用了內(nèi)存映射結(jié)合數(shù)據(jù)分塊技術(shù),根據(jù)待解壓的塊數(shù)建立特定大小的內(nèi)存映射文件,按照塊號從小到大的順序?qū)⒔鈮嚎s數(shù)據(jù)塊依次放入內(nèi)存映射空間中,期間需要根據(jù)寫入數(shù)據(jù)的位置、內(nèi)存映射空間的大小、重新映射的閾值進行重新映射,并調(diào)整重新映射的閾值。詳細說明見具體實施部分。
[0049]針對DNA讀序數(shù)據(jù)FASTQ文件的壓縮與解壓縮,近幾年取得重要進展的是G_SQZ和DSRC這一類分塊索引串行算法。目前尚未見到與這類算法相關(guān)的并行算法的研究文章和專利。隨著基因組序列分析的數(shù)據(jù)達到TB級甚至PB級規(guī)模,為便于對大量基因組序列數(shù)據(jù)實時分析,必須對其進行實時數(shù)據(jù)壓縮和解壓縮,這需要借助高性能計算平臺的強大的計算能力。因此,研究上述G_SQZ和DSRC這一類分塊索引串行算法的并行壓縮解壓縮方
法具有重要意義。
[0050]本發(fā)明首次提出上述G_SQZ和DSRC這一類分塊索引串行壓縮解壓縮算法相應(yīng)的并行壓縮和并行解壓縮方法。利用循環(huán)雙緩沖隊列、循環(huán)雙內(nèi)存映射和內(nèi)存映射并結(jié)合數(shù)據(jù)分塊處理、多線程流水并行壓縮解壓縮處理、讀寫順序二維數(shù)組等技術(shù),實現(xiàn)FASTQ文件的多個進程以及進程內(nèi)的多個線程之間的并行壓縮和并行解壓縮處理。
[0051]本發(fā)明的優(yōu)點在于:
[0052](I)本發(fā)明充分利用各個計算節(jié)點以及節(jié)點內(nèi)多核CPU的強大計算能力,能夠解決串行壓縮解壓縮程序所受到的處理器、內(nèi)存等資源的限制。本并行壓縮和并行解壓縮方法實現(xiàn)靈活,可以基于MPI和OpenMP實現(xiàn),也可以基于MPI和Pthread實現(xiàn)。
[0053](2)由于本發(fā)明適用于任何數(shù)據(jù)塊內(nèi)的壓縮和解壓縮算法,因此本并行壓縮和并行解壓縮方法并不僅僅局限于G_SQZ和DSRC這兩個串行算法的并行化,只要串行壓縮解壓縮算法具有分塊和索引這兩個特征,本并行壓縮和并行解壓縮方法就適用于這類分塊索引串行算法的并行化。
[0054](3)本發(fā)明充分利用高性能計算平臺的強大的計算能力,能夠大幅度提升海量基因組序列實時分析處理的速度,對基因數(shù)據(jù)的更廣泛應(yīng)用提供重要的技術(shù)基礎(chǔ)。
【專利附圖】
【附圖說明】
[0055]圖1為本發(fā)明并行壓縮方法中進程內(nèi)多線程流水并行壓縮圖;
[0056]圖2為本發(fā)明中原始數(shù)據(jù)循環(huán)雙緩沖隊列圖;
[0057]圖3為本發(fā)明并行壓縮方法中壓縮數(shù)據(jù)塊緩沖區(qū);
[0058]圖4為本發(fā)明并行解壓縮方法中的進程內(nèi)多線程流水并行解壓縮圖;
[0059]圖5為本發(fā)明并行解壓縮方法中循環(huán)雙內(nèi)存映射與壓縮數(shù)據(jù)塊緩沖區(qū)關(guān)系圖;
[0060]圖6為本發(fā)明并行解壓縮方法中循環(huán)雙內(nèi)存映射在讀取線程和解壓縮工作線程間的協(xié)同;
[0061]圖中1.內(nèi)存映射1,2.內(nèi)存映射2,3.時間軸,4.內(nèi)存映射區(qū)域指針,5.塊在內(nèi)存映射區(qū)域起始點,6.壓縮數(shù)據(jù)塊長度,7.壓縮數(shù)據(jù)塊號。
【具體實施方式】
[0062]本發(fā)明提供一種DNA讀序數(shù)據(jù)的FASTQ文件的并行壓縮解壓縮方法,為使本發(fā)明的目的、技術(shù)方案及效果更加清楚、明確,以下結(jié)合附圖,對本發(fā)明進一步詳細說明。應(yīng)當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0063]下面詳細解釋FASTQ文件的并行壓縮方法中的原始數(shù)據(jù)讀取線程,其具體實施步驟如下所示:
[0064](I)打開待壓縮的原始DNA讀序數(shù)據(jù)FASTQ壓縮文件。
[0065](2)獲取當前運行機器的文件系統(tǒng)的內(nèi)存分頁大小。[0066](3)根據(jù)內(nèi)存分頁大小設(shè)定內(nèi)存映射空間大小。
[0067](4)根據(jù)進程任務(wù)分割模塊所分配的當前進程所需處理的原始數(shù)據(jù)的范圍,設(shè)定內(nèi)存映射的起始點(起始點需要根據(jù)內(nèi)存頁面大小,對齊內(nèi)存頁面的邊界)以及映射數(shù)據(jù)大小,進行內(nèi)存映射。
[0068](5)記錄進程內(nèi)第一個原始數(shù)據(jù)壓縮塊的內(nèi)存映射起始位置。
[0069](6)循環(huán)依次查找各個壓縮工作線程的原始數(shù)據(jù)循環(huán)雙緩沖隊列,查找空塊緩沖區(qū)。
[0070](7)若空快緩沖區(qū)存在,轉(zhuǎn)(8),否則轉(zhuǎn)(6)。
[0071](8)從內(nèi)存映射區(qū)域,以記錄為粒度,循環(huán)順序讀取一定數(shù)目的記錄數(shù)據(jù),形成一個原始數(shù)據(jù)塊,填充該空塊緩沖區(qū),塊號加1,存儲塊內(nèi)的記錄數(shù)目?;蛘叩竭_映射終點時轉(zhuǎn)
(9)。
[0072](9)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列的原始數(shù)據(jù)塊隊列末端。
[0073](10)在讀寫順序二維數(shù)組中設(shè)置此塊的線程分配號。
[0074](11)當前若到達進程分配任務(wù)的數(shù)據(jù)末端,轉(zhuǎn)(15),否則,轉(zhuǎn)(12)。
[0075](12)根據(jù)當前讀取的內(nèi)存映射結(jié)束位置,計算已讀取的原始數(shù)據(jù)塊的長度,設(shè)置待讀取的下一個塊在內(nèi)存映射區(qū)域中的起始位置。
[0076](13)若(當前內(nèi)存映射讀取位置距離此次映射結(jié)束位置的長度小于1.5倍的前一個剛讀取完畢的塊的長度)&& (沒有到達文件結(jié)束位置),轉(zhuǎn)(14),否則(8)。
[0077](14)釋放上一次內(nèi)存映射,根據(jù)當前文件讀取位置(下一個待讀塊的起始點)計算下一次內(nèi)存映射的起始點以及映射大小,重新進行內(nèi)存映射。轉(zhuǎn)(8 )。
[0078](15)釋放內(nèi)存映射,設(shè)置讀取線程結(jié)束標志。
[0079](16)原始數(shù)據(jù)讀取線程結(jié)束。
[0080]上述步驟中所使用的原始數(shù)據(jù)循環(huán)雙緩沖隊列中的原始數(shù)據(jù)塊緩沖區(qū)如圖3所示。此緩沖區(qū)使用一個結(jié)構(gòu)體實現(xiàn),包含三個字段——塊數(shù)據(jù)指針、塊號和塊內(nèi)記錄數(shù)目,塊數(shù)據(jù)指針指向一個記錄數(shù)組,每個數(shù)組元素指向一個記錄對象,這個記錄對象包含F(xiàn)ASTQ四部分信息(title部分,DNA sequence部分”部分,Quality Score部分)的全部數(shù)據(jù),
分別為:title部分-title數(shù)據(jù)指針、title數(shù)據(jù)長度、title預(yù)留空間長度,其中title
數(shù)據(jù)指針指向title數(shù)據(jù)緩沖區(qū);DNA sequence部分-sequence數(shù)據(jù)指針、sequence數(shù)
據(jù)長度、sequence預(yù)留空間長度,其中sequence數(shù)據(jù)指針指向sequence數(shù)據(jù)緩沖區(qū);“ + ”
部分-plus數(shù)據(jù)指針、plus數(shù)據(jù)長度、plus預(yù)留空間長度,其中plus數(shù)據(jù)指針指向plus
數(shù)據(jù)緩沖區(qū);Quality Score部分-Quality數(shù)據(jù)指針、Quality數(shù)據(jù)長度、Quality預(yù)
留空間長度,其中Quality數(shù)據(jù)指針指向Quality數(shù)據(jù)緩沖區(qū);DNA讀序數(shù)據(jù)截斷信息-
sequence截斷信息vector和quality截斷信息vector
[0081]下面詳細解釋FASTQ文件的并行壓縮方法中的壓縮工作線程,其具體實施步驟如下所示:
[0082](I)壓縮工作線程前期準備工作,包含線程中對象的建立與初始化工作。
[0083]( 2 )從原始數(shù)據(jù)循環(huán)雙緩沖隊列的原始數(shù)據(jù)塊隊列中取得隊列頭。
[0084](3)所取得的隊列頭若為空,轉(zhuǎn)(2),否則轉(zhuǎn)(4)。
[0085](4)壓縮此隊列頭緩沖區(qū)中的原始數(shù)據(jù)塊,將壓縮后數(shù)據(jù)存入線程內(nèi)的臨時緩沖區(qū),并記錄壓縮后的塊數(shù)據(jù)大小。
[0086]( 5 )釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的空塊緩沖區(qū)隊列中。
[0087](6)從壓縮數(shù)據(jù)循環(huán)雙緩沖隊列的空塊緩沖區(qū)隊列中取得隊列頭。
[0088](7)所取得的隊列頭若為空,轉(zhuǎn)(6),否則轉(zhuǎn)(8)。
[0089](8)將線程內(nèi)的臨時緩沖區(qū)中緩存的壓縮后的塊數(shù)據(jù)存入此隊列頭中的空塊緩沖區(qū)中,并記錄壓縮數(shù)據(jù)大小以及塊號。
[0090](9)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列的尾部。
[0091](10)在讀寫順序二維數(shù)組中設(shè)置此塊的壓縮處理完畢標志。
[0092](11)若原始數(shù)據(jù)讀取線程結(jié)束并且所有塊均處理完畢,轉(zhuǎn)(13 ),否則轉(zhuǎn)(2 )。
[0093](12)若壓縮數(shù)據(jù)寫入線程結(jié)束,轉(zhuǎn)(13),否則轉(zhuǎn)(2)。
[0094]( 13)設(shè)置此壓縮工作線程結(jié)束標志。
[0095]( 14)此壓縮工作線程結(jié)束。
[0096]需要注意的是,上述步驟(4)中的每個原始數(shù)據(jù)塊緩沖區(qū)數(shù)據(jù)可以根據(jù)需求,使用DSRC算法、G_SQZ算法等此類分塊索引的算法來壓縮數(shù)據(jù)。
[0097]上述步驟中所使用的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊緩沖區(qū)使用一個結(jié)構(gòu)體實現(xiàn),包含四個字段——壓縮數(shù)據(jù)塊指針、壓縮數(shù)據(jù)塊長度、壓縮數(shù)據(jù)塊號和塊內(nèi)記錄數(shù)目,其中壓縮數(shù)據(jù)塊指針指向一個數(shù)據(jù)緩沖區(qū)。
[0098]下面詳細解釋FASTQ文件的并行壓縮方法中的壓縮數(shù)據(jù)寫入線程,其具體實施步驟如下所示:
[0099](I)壓縮數(shù)據(jù)寫入線程準備工作,包含在壓縮文件的頭部寫入塊數(shù)據(jù)包含的記錄數(shù)目設(shè)置信息。
[0100](2)設(shè)置塊號 block_no=0。
[0101](3)查找讀寫順序二維數(shù)組bloCk_no號塊壓縮處理標志。
[0102](4)若block_no塊壓縮完畢,轉(zhuǎn)(5),否則轉(zhuǎn)(3)。
[0103](5)從壓縮數(shù)據(jù)循環(huán)雙緩沖隊列的壓縮數(shù)據(jù)塊隊列中取得隊列頭。
[0104](6)若隊列頭為空,轉(zhuǎn)(5),否則轉(zhuǎn)(7)。
[0105](7)將此隊列頭的壓縮數(shù)據(jù)塊寫入最終的壓縮文件中。
[0106](8)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的空塊緩沖區(qū)隊列尾部。
[0107](9) block_no 加 I
[0108](10)若原始數(shù)據(jù)讀取線程結(jié)束并且所有塊均已經(jīng)寫入最終的壓縮文件,轉(zhuǎn)(11),否則轉(zhuǎn)(3)。
[0109](11)在壓縮文件末尾寫入各個塊壓縮位流在壓縮文件中的位置索引、總的塊數(shù)、文件尾起始位置等壓縮文件尾部信息。
[0110](12)設(shè)置壓縮數(shù)據(jù)寫入線程結(jié)束標志。
[0111](13)壓縮數(shù)據(jù)寫入線程結(jié)束。
[0112]下面詳細解釋FASTQ文件的并行解壓縮方法中的壓縮數(shù)據(jù)讀取線程,其具體實施步驟如下所示:
[0113](I)打開進程分配的待解壓縮的壓縮文件,獲取文件描述符1,即fdl。
[0114](2)再次打開進程分配的待解壓縮的壓縮文件,獲取文件描述符2,即fd2。[0115](3)獲取當前運行機器的文件系統(tǒng)的內(nèi)存分頁大小。
[0116](4)根據(jù)內(nèi)存分頁大小設(shè)定內(nèi)存映射空間大小。
[0117](5)根據(jù)壓縮文件尾部的各個塊壓縮位流的位置索引信息,得到進程待解壓縮的所有塊在壓縮位流中的起始位置和結(jié)束位置。
[0118](6)根據(jù)上述起始位置,設(shè)定內(nèi)存映射的起始點(起始點需要根據(jù)內(nèi)存頁面大小,對齊內(nèi)存頁面的邊界)、映射數(shù)據(jù)大小、內(nèi)存映射結(jié)束點,對fdl進行映射內(nèi)存映射得到內(nèi)存映射區(qū)域I的內(nèi)存地址IpBufl。當前映射起始點和結(jié)束點是相對整個壓縮文件計算。
[0119](7)設(shè)置當前內(nèi)存映射區(qū)域號current_buffer_symbol為I。
[0120](8)初始化內(nèi)存映射區(qū)域轉(zhuǎn)換次數(shù)變量reVerSe_num為O ;初始化當前內(nèi)存映射區(qū)域Current_lpbufTer的起始塊號變量和終止塊號變量均為0,初始化前一個內(nèi)存映射區(qū)域last_lpbuffer的起始塊號變量和終止塊號變量均為O。
[0121](9)設(shè)置當前待解壓縮塊的塊號=0。
[0122](10)檢索壓縮位流位置索引信息,得到當前待解壓塊在壓縮文件中的起始位置和結(jié)束位置。
[0123](11)如果當前待解壓塊的起始位置和結(jié)束位置在當前映射區(qū)域的范圍內(nèi),轉(zhuǎn)
(20);否則,轉(zhuǎn)(12)。
[0124](12)內(nèi)存映射區(qū)域轉(zhuǎn)換次數(shù)變量reverse_num+l。
[0125](13)當前內(nèi)存映射區(qū)域的起始塊號值賦值給前一個內(nèi)存映射區(qū)域的起始塊號變量,當前塊號值賦值給當前內(nèi)存映射區(qū)域的起始塊號變量,(當前塊號值-1)賦值給前一個內(nèi)存映射區(qū)域的終止塊號變量。
[0126](14)根據(jù)當前待解壓塊在壓縮文件中的起始位置,設(shè)定內(nèi)存映射的起始點(起始點需要根據(jù)內(nèi)存頁面大小,對齊內(nèi)存頁面的邊界)、映射數(shù)據(jù)大小、內(nèi)存映射結(jié)束點。當前映射起始點和結(jié)束點是相對整個壓縮文件計算。
[0127](15)改變當前內(nèi)存映射區(qū)域號,即兩個映射輪換:若current_buffer_symbol為I,則更改為2 ;若current_buffer_symbol為2,則更改為I。
[0128](16)若 reverse_num>=2,則轉(zhuǎn)(17),否則轉(zhuǎn)(19)
[0129](17)根據(jù)前一個內(nèi)存映射區(qū)域記錄的起始塊號和終止塊號,不斷循環(huán)查詢讀寫順序二維數(shù)組中相應(yīng)塊的解壓縮處理結(jié)束標志,直至范圍內(nèi)的所有塊均被解壓縮處理結(jié)束。轉(zhuǎn)(18)。
[0130](18)如果current_buffer_symbol=l,釋放內(nèi)存映射I ;否則釋放內(nèi)存映射2。
[0131](19)如果current_buffer_symbol=l,則重新對fdl進行內(nèi)存映射I得到內(nèi)存映射地址Ipbuf 1,否者重新對fd2進行內(nèi)存映射2得到內(nèi)存映射地址lpbuf2。上面重新進行的內(nèi)存映射參數(shù)均是(14)中計算出的參數(shù)。
[0132](20)循環(huán)依次查找各個解壓縮工作線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列,查找空塊緩沖區(qū)。
[0133](21)若空塊緩沖區(qū)存在,轉(zhuǎn)(22),否則轉(zhuǎn)(20)。
[0134](22)根據(jù)current_buffer_symbo1、當前內(nèi)存映射區(qū)域的映射起始點、當前待解壓塊的起始位置和結(jié)束位置,設(shè)置當前得到的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū)結(jié)構(gòu)中四個字段:塊在內(nèi)存映射區(qū)域起始點、內(nèi)存映射區(qū)域指針、壓縮數(shù)據(jù)塊長度、壓縮數(shù)據(jù)塊號,形成壓縮數(shù)據(jù)塊緩沖區(qū)。
[0135]( 23)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列的壓縮數(shù)據(jù)塊隊列末端。
[0136](24)在讀寫順序二維數(shù)組中設(shè)置此塊的線程分配號。
[0137](25)當前待解壓塊的塊號加一,若當前待解壓塊的塊號〉進程待解壓的最大塊號,轉(zhuǎn)(26),否者轉(zhuǎn)(10)。
[0138](26)等待寫線程結(jié)束,若沒有結(jié)束,則一直等待;若寫線程結(jié)束,釋放內(nèi)存映射I和內(nèi)存映射2,關(guān)閉fdl和fd2。
[0139](27)設(shè)置壓縮數(shù)據(jù)讀取線程結(jié)束標志。
[0140](28)壓縮數(shù)據(jù)讀取線程結(jié)束。
[0141]上述步驟中所使用的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊緩沖區(qū)使用一個結(jié)構(gòu)體實現(xiàn),包含四個字段——內(nèi)存映射區(qū)域指針(4 )、塊在內(nèi)存映射區(qū)域起始點(5 )、壓縮數(shù)據(jù)塊長度(6)和壓縮數(shù)據(jù)塊號(7)。為節(jié)省空間以及數(shù)據(jù)多次拷貝的時間,直接使用指針指向壓縮數(shù)據(jù)塊所在的內(nèi)存映射區(qū)域以及塊在內(nèi)存映射區(qū)域的起始點。
[0142]圖5示出了并行解壓縮方法中循環(huán)雙內(nèi)存映射與壓縮數(shù)據(jù)塊緩沖區(qū)的關(guān)系圖。圖中以塊I為例,顯示了緩沖區(qū)的每個字段與雙內(nèi)存映射區(qū)域——內(nèi)存映射(I)和內(nèi)存映射
(2)的關(guān)系??梢钥闯鼋鈮嚎s工作線程直接在壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中使用循環(huán)雙內(nèi)存映射區(qū)域,減少了數(shù)據(jù)拷貝次數(shù)。需要注意的是,每次內(nèi)存映射的起始點和結(jié)束點很有可能不在塊的開始和結(jié)束位置,這是由于起始點需要根據(jù)內(nèi)存頁面大小對齊內(nèi)存頁面的邊界,內(nèi)存映射的空間大小除了最后一次映射受文件尾部影響映射大小外,其余的映射大小均是一個固定值。有的塊在一個內(nèi)存映射中只包含了部分數(shù)據(jù),這樣的塊需要在另外一個內(nèi)存映射中重新映射整塊數(shù)據(jù)。
[0143]下面詳細解釋FASTQ文件的并行解壓縮方法中的解壓縮工作線程,其具體實施步驟如下所示:
[0144](I)解壓縮工作線程前期準備工作,包含線程獲取進程開始階段處理壓縮文件頭和文件尾得到的塊記錄數(shù)設(shè)置信息、壓縮文件包含的壓縮塊數(shù)目、每個塊在壓縮文件中的位置索引等信息,以及此線程中一些對象的建立和初始化等工作。
[0145](2)從壓縮數(shù)據(jù)循環(huán)雙緩沖隊列的壓縮數(shù)據(jù)塊隊列中取得隊列頭。
[0146](3)所取得的隊列頭若為空,轉(zhuǎn)(2),否則轉(zhuǎn)(4)。
[0147](4)讀取此隊列頭緩沖區(qū)結(jié)構(gòu)中的四個字段的數(shù)據(jù)一塊在內(nèi)存映射區(qū)域起始點、內(nèi)存映射區(qū)域指針、壓縮數(shù)據(jù)塊長度、壓縮數(shù)據(jù)塊號,解壓縮此塊的壓縮位流,將解壓縮后數(shù)據(jù)存入線程內(nèi)特定的塊記錄結(jié)構(gòu)對象中。
[0148](5)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的空塊緩沖區(qū)隊列中。
[0149](6)從解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列的空塊緩沖區(qū)隊列中取得隊列頭。
[0150](7)所取得的隊列頭若為空,轉(zhuǎn)(6),否則轉(zhuǎn)(8)。
[0151](8)線程內(nèi)在塊記錄結(jié)構(gòu)對象中緩存的解壓縮后的塊數(shù)據(jù)存入此隊列頭中的空塊緩沖區(qū)中,并記錄解壓縮數(shù)據(jù)塊的長度以及塊號。
[0152](9)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的解壓縮數(shù)據(jù)塊隊列的尾部。
[0153](10)在讀寫順序二維數(shù)組中設(shè)置此塊的解壓縮處理完畢標志。
[0154](11)檢索讀寫順序二維數(shù)組,若所有塊均解壓縮處理完畢,轉(zhuǎn)(13 ),否則轉(zhuǎn)(2 )。[0155](12)若解壓縮數(shù)據(jù)寫入線程結(jié)束,轉(zhuǎn)(13),否則轉(zhuǎn)(2)。
[0156](13)設(shè)置此解壓縮工作線程結(jié)束標志。
[0157](14)此解壓縮工作線程結(jié)束。
[0158]需要注意的是,上述步驟(4)中的每個壓縮塊緩沖區(qū)數(shù)據(jù)可以根據(jù)壓縮算法,使用DSRC算法、G_SQZ算法等此類分塊索引的算法來解壓縮數(shù)據(jù)。
[0159]上述步驟中所使用的解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的解壓縮數(shù)據(jù)塊緩沖區(qū)使用一個結(jié)構(gòu)體實現(xiàn),包含三個字段一解壓縮數(shù)據(jù)塊指針、解壓縮數(shù)據(jù)塊長度和解壓縮數(shù)據(jù)塊號,其中解壓縮數(shù)據(jù)塊指針指向一個緩沖區(qū)。
[0160]圖6顯示了并行解壓縮方法中循環(huán)雙內(nèi)存映射——內(nèi)存映射I (I)和內(nèi)存映射2
(2)在讀取線程和解壓縮工作線程間的協(xié)同,時間軸為(3),塊的設(shè)置和圖5相同。圖中可以看出,在第二次使用內(nèi)存映射I (I)重新映射時,需要等待所有解壓縮工作線程處理完原有內(nèi)存映射I (I)中的所有塊數(shù)據(jù),即等待塊O到塊i處理完畢后,才能夠釋放上次映射,重新映射塊j+Ι到塊k的數(shù)據(jù)。同樣的情況也出現(xiàn)在第二次使用內(nèi)存映射2 (2)重新內(nèi)存映射新的壓縮塊的時候,需要等待所有解壓縮線程處理完塊i+Ι到塊j+1。
[0161]下面詳細解釋FASTQ文件的并行解壓縮方法中的解壓縮數(shù)據(jù)寫入線程,其具體實施步驟如下所示:
[0162](I)解壓縮數(shù)據(jù)寫入線程準備工作,包含解壓縮文件名的確定。
[0163](2)獲取當前運行機器的文件系統(tǒng)的內(nèi)存分頁大小。
[0164](3)根據(jù)待解壓的塊數(shù),設(shè)置內(nèi)存映射文件的大小qwFileSize。根據(jù)內(nèi)存分頁大小,設(shè)置每次內(nèi)存映射區(qū)域的大小,以及重新進行內(nèi)存映射的閾值。
[0165](4)建立解壓縮文件,得到文件描述符fd,并設(shè)置文件所占用空間為qwFileSize大小。
[0166](5)計算本次內(nèi)存映射大小,對fd進行內(nèi)存映射,得到內(nèi)存映射的內(nèi)存空間地址IpBuf0
[0167](6)設(shè)置塊號 block_no=0。
[0168](7)查找讀寫順序二維數(shù)組中的block_no號塊解壓縮處理標志。
[0169](8)若block_no塊解壓縮完畢,轉(zhuǎn)(9),否則轉(zhuǎn)(7)。
[0170](9)從解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列的解壓縮數(shù)據(jù)塊隊列中取得隊列頭。
[0171](10)若隊列頭為空,轉(zhuǎn)(9),否則轉(zhuǎn)(11)。
[0172](11)將此隊列頭的解壓縮數(shù)據(jù)塊寫入內(nèi)存映射區(qū)域中,內(nèi)存映射區(qū)域數(shù)據(jù)偏移以及文件數(shù)據(jù)的偏移均根據(jù)寫入數(shù)據(jù)的大小相應(yīng)地增加。
[0173](12)釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的空塊緩沖區(qū)隊列尾部。
[0174](13)若當前內(nèi)存映射區(qū)域?qū)懭氲臄?shù)據(jù)達到閾值,釋放此內(nèi)存映射。并根據(jù)當前文件數(shù)據(jù)的偏移和文件大小計算內(nèi)存映射的起點、映射大小、內(nèi)存映射區(qū)域數(shù)據(jù)偏移以及新的閾值,重新進行內(nèi)存映射。
[0175](14) block_no 力口 I。
[0176](15)若所有塊均已經(jīng)寫入內(nèi)存映射區(qū)域,轉(zhuǎn)(16),否則轉(zhuǎn)(7)。
[0177](16)釋放內(nèi)存映射將解壓縮數(shù)據(jù)寫入最終的解壓縮文件中,關(guān)閉文件描述符。
[0178](17)設(shè)置解壓縮數(shù)據(jù)寫入線程結(jié)束標志。 [0179] (18)解壓縮數(shù)據(jù)寫入線程結(jié)束。
【權(quán)利要求】
1.一種DNA讀序數(shù)據(jù)FASTQ文件并行壓縮方法,其特征在于包括并行壓縮進程任務(wù)分割部分和壓縮進程處理部分,具體如下: (一)并行壓縮進程任務(wù)分割部分 根據(jù)FASTQ文件大小、并行壓縮進程數(shù)目、FASTQ文件中每個讀序片段——每個記錄的數(shù)據(jù)特點,確定每個壓縮進程待處理數(shù)據(jù)的起始和結(jié)束位置;每個進程將待壓縮的原始數(shù)據(jù)近似均勻地分配到各個進程上,以實現(xiàn)數(shù)據(jù)并行,這樣每個進程在處理時相互之間沒有通信時間的消耗,提升了數(shù)據(jù)并行的處理效率;每個進程得到單獨的壓縮文件,壓縮數(shù)據(jù)的順序與進程號一致; (二)壓縮進程處理部分負責進程內(nèi)多線程流水并行壓縮 每個壓縮進程處理部分包含一個原始數(shù)據(jù)讀取線程、一個壓縮數(shù)據(jù)寫入線程和多個壓縮工作線程;工作線程的具體數(shù)目可以根據(jù)硬件CPU的核數(shù)以及進程設(shè)置來設(shè)定; 每個進程所處理的待壓縮數(shù)據(jù)被原始數(shù)據(jù)讀取線程分成多個塊,每個塊包含特定的固定數(shù)目的記錄,最末端塊少于所述固定數(shù)目; 每個工作線程均有兩個循環(huán)雙緩沖隊列,一個是原始數(shù)據(jù)循環(huán)雙緩沖隊列,另一個是壓縮數(shù)據(jù)循環(huán)雙緩沖隊列;每個原始數(shù)據(jù)循環(huán)雙緩沖隊列包含兩個隊列:一個是空塊緩沖區(qū)隊列,一個是原始數(shù)據(jù)塊隊列;每個壓縮數(shù)據(jù)循環(huán)雙緩沖隊列也包含兩個隊列:一個是空塊緩沖區(qū)隊列,另一個是壓縮數(shù)據(jù)塊隊列; 在每個進程內(nèi),進行以原始數(shù)據(jù)塊為單位的數(shù)據(jù)的并行壓縮流水線處理,具體流水并行處理流程如下: (1)原始數(shù)據(jù)讀取線程不斷地根據(jù)記錄數(shù)據(jù)特點解析讀取原始數(shù)據(jù)塊,循環(huán)依次查找每個壓縮工作線程的原始`數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū),找到后將原始數(shù)據(jù)塊放入,然后釋放此塊緩沖區(qū)到此循環(huán)雙緩沖隊列中的原始數(shù)據(jù)塊隊列的末端; 原始數(shù)據(jù)讀取線程采用了內(nèi)存映射結(jié)合數(shù)據(jù)分塊技術(shù); (2)每個壓縮工作線程不斷地從本線程的原始數(shù)據(jù)循環(huán)雙緩沖隊列中的原始數(shù)據(jù)塊隊列頭獲取原始數(shù)據(jù)塊,然后進行壓縮處理; (3)每個壓縮工作線程不斷地將壓縮后的塊數(shù)據(jù)填充到獲取的本線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū)中,并釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列的壓縮數(shù)據(jù)塊隊列的尾部; (4)壓縮數(shù)據(jù)寫入線程不斷地按照塊號從小到大的順序依次查找已經(jīng)壓縮處理完畢的塊數(shù)據(jù)所在的線程號,獲取此線程內(nèi)的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列頭中的此塊壓縮數(shù)據(jù),寫入最終的壓縮文件。
2.根據(jù)權(quán)利要求1所述的DNA讀序數(shù)據(jù)FASTQ文件并行壓縮方法,其特征在于:所述原始數(shù)據(jù)循環(huán)雙緩沖隊列處理方式如下: (1)原始數(shù)據(jù)循環(huán)雙緩沖隊列初始化處理:將空塊緩沖區(qū)隊列實例化,具有特定數(shù)目的空塊緩沖區(qū),原始數(shù)據(jù)塊隊列為空; (2)原始數(shù)據(jù)讀取線程讀取一個原始數(shù)據(jù)塊; (3)在空塊緩沖區(qū)隊列頭獲取一個空塊緩沖區(qū); (4)用原始數(shù)據(jù)塊填充獲取的這個空塊緩沖區(qū); (5)將這個填充的原始數(shù)據(jù)塊放入原始數(shù)據(jù)塊隊列的末端;(6)壓縮工作線程在原始數(shù)據(jù)塊隊列頭中獲取一個原始數(shù)據(jù)塊緩沖區(qū)中的塊數(shù)據(jù)進行壓縮處理; (7)將此原始數(shù)據(jù)塊緩沖區(qū)清空,并放入空塊緩沖區(qū)隊列。
3.根據(jù)權(quán)利要求1所述的DNA讀序數(shù)據(jù)FASTQ文件并行壓縮方法,其特征在于:所述原始數(shù)據(jù)讀取線程采用的內(nèi)存映射結(jié)合數(shù)據(jù)分塊技術(shù),用來提高大文件的讀取速度,結(jié)合數(shù)據(jù)分塊,其主要是根據(jù)內(nèi)存頁面大小以及映射的空間大小,計算每個塊的數(shù)據(jù)在內(nèi)存映射空間的位置,以及何時進行內(nèi)存映射空間的釋放和重新映射。
4.一種DNA讀序數(shù)據(jù)FASTQ文件并行解壓縮方法,其特征在于包括下列部分: (一)根據(jù)進程號確定并行解壓縮進程需要處理的壓縮文件 待壓縮的FASTQ文件根據(jù)設(shè)置的并行壓縮進程的數(shù)目得到相應(yīng)數(shù)目的壓縮文件;在并行解壓縮中,根據(jù)壓縮文件的數(shù)目設(shè)置并行解壓縮進程的數(shù)目,各個解壓縮進程得到的解壓縮文件的順序由壓縮文件的順序決定;每個解壓縮進程在處理時相互之間沒有通信時間的消耗,提升了數(shù)據(jù)并行的處理效率; (二)讀取壓縮文件尾部,獲取塊設(shè)置、塊索引和塊數(shù)信息 在每個進程初始從壓縮文件的尾部獲得塊包含的記錄數(shù)目的設(shè)置、每個塊在壓縮文件中的位置索弓1、塊的數(shù)目信息; (三)并行解壓縮進程內(nèi)進行多線程流水并行解壓縮 每個并行解壓縮進程包含一個壓縮數(shù)據(jù)讀取線程、一個解壓縮數(shù)據(jù)寫入線程和多個解壓縮工作線程; 每個解壓縮工作線程有兩個循環(huán)雙緩沖隊列,一個是壓縮數(shù)據(jù)循環(huán)雙緩沖隊列,一個是解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列;每個壓縮數(shù)據(jù)循環(huán)雙緩沖隊列包含兩個隊列:一個是空塊緩沖區(qū)隊列,另一個是壓縮數(shù)據(jù)塊隊列;每個解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列也包含兩個隊列:一個是空塊緩沖區(qū)隊列,另一個是解壓縮數(shù)據(jù)塊隊列; 在每個進程內(nèi),進行以壓縮塊為單位的數(shù)據(jù)的并行解壓縮流水線處理,具體并行流水處理流程如下: (1)壓縮數(shù)據(jù)讀取線程根據(jù)壓縮文件尾部得到的壓縮塊的位置索引信息,按照塊號從小到大的順序,不斷地讀取已知壓縮大小的壓縮塊,循環(huán)依次查找每個解壓縮工作線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列頭的空塊緩沖區(qū),找到后將壓縮塊數(shù)據(jù)放入,并釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列的末端; 壓縮數(shù)據(jù)讀取線程采用循環(huán)雙內(nèi)存映射結(jié)合數(shù)據(jù)分塊技術(shù); (2)每個解壓縮工作線程不斷地從本線程的壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊隊列頭獲取壓縮數(shù)據(jù)塊,然后進行解壓縮處理; (3)每個解壓縮工作線程不斷地將解壓縮后的塊數(shù)據(jù)填充到獲取的本線程的解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的空塊緩沖區(qū)中,并釋放此緩沖區(qū)到此循環(huán)雙緩沖隊列的解壓縮數(shù)據(jù)塊隊列尾部; (4)解壓縮數(shù)據(jù)寫入線程不斷地按照塊號從小到大的順序依次查找已經(jīng)壓縮處理完畢的塊數(shù)據(jù)所在的線程號,獲取此線程內(nèi)的解壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的解壓縮數(shù)據(jù)塊隊列頭的此塊解壓縮數(shù)據(jù),寫入最終的壓縮文件。
5.根據(jù)權(quán)利要求4所述的DNA讀序數(shù)據(jù)FASTQ文件并行解壓縮方法,其特征在于:所述壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中的壓縮數(shù)據(jù)塊緩沖區(qū)使用一個結(jié)構(gòu)體實現(xiàn),包含四個字段一內(nèi)存映射區(qū)域指針、塊在內(nèi)存映射區(qū)域起始點、壓縮數(shù)據(jù)塊長度和壓縮數(shù)據(jù)塊號;為節(jié)省空間以及數(shù)據(jù)多次拷貝的時間,直接使用指針指向壓縮數(shù)據(jù)塊所在的內(nèi)存映射區(qū)域以及塊在內(nèi)存映射區(qū)域的起始點。
6.根據(jù)權(quán)利要求4所述的DNA讀序數(shù)據(jù)FASTQ文件并行解壓縮方法,其特征在于:所述壓縮數(shù)據(jù)讀取線程采用的循環(huán)雙內(nèi)存映射技術(shù)結(jié)合數(shù)據(jù)分塊技術(shù),用來提高大數(shù)據(jù)文件的讀取速度,具體實現(xiàn)如下: 其中關(guān)鍵技術(shù)是循環(huán)雙內(nèi)存映射技術(shù),使得解壓縮工作線程讀取壓縮數(shù)據(jù)進行解壓縮和壓縮數(shù)據(jù)讀取線程內(nèi)存映射并行執(zhí)行,即具有兩個內(nèi)存映射一內(nèi)存映射I和內(nèi)存映射`2,按照壓縮塊的順序依次循環(huán)放入這兩個內(nèi)存映射中;根據(jù)壓縮文件尾部的壓縮塊數(shù)據(jù)位置索引信息,以及兩個內(nèi)存映射空間的大小,按照塊號從小到大的順序,依次計算每個壓縮塊數(shù)據(jù)所在的內(nèi)存映射緩沖區(qū)以及在內(nèi)存映射緩沖區(qū)內(nèi)的位置信息;解壓縮工作線程直接在壓縮數(shù)據(jù)循環(huán)雙緩沖隊列中使用此循環(huán)雙內(nèi)存映射區(qū)域,以減少數(shù)據(jù)拷貝次數(shù);對于正在使用的內(nèi)存映射,需要等待此內(nèi)存映射的前一次映射數(shù)據(jù)被所有的解壓縮工作線程使用完畢后,才能重新進行內(nèi)`存映射。
【文檔編號】G06F9/38GK103559020SQ201310551802
【公開日】2014年2月5日 申請日期:2013年11月7日 優(yōu)先權(quán)日:2013年11月7日
【發(fā)明者】鄭晶晶, 王婷, 張常有, 詹科 申請人:中國科學院軟件研究所, 廣州中國科學院軟件應(yīng)用技術(shù)研究所