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