一种FASTQ文件的并行压缩和解压方法及系统与流程

文档序号:22118532发布日期:2020-09-04 15:53阅读:742来源:国知局
一种FASTQ文件的并行压缩和解压方法及系统与流程

本发明是关于一种fastq文件的并行压缩和解压方法及系统,属于生物信息数据处理技术领域。



背景技术:

自dna测序技术诞生以来,测序数据不断增长,且增长速度越来越快,随着测序数据的积累,数据管理成本不断提升,包括存储成本和传输成本,因此需要将测序数据进行数据压缩以降低成本,这就是测序数据压缩工具的意义。

作为通用的基因组数据存储格式,fastq文件负责存储核酸序列和相应质量分数,其以四行为单位表示一个短读序列,包括了标识符、碱基序列以及质量值,标准的fastq格式文件结构如下:

@srr001666.1071112_slxa-eas1_s_7:5:1:817:345length=36

gggtgatggccgctgccgatggcgtcaaatcccacc

+

iiiiiiiiiiiiiiiiiiiiiiiiiiiiii9ig9ic

其中,第一行和第三行为标识符,第一行以@开头,后面跟随着这条短读序列的标识符,第三行以+开头,后面可能跟随着同样的标识符,也可能不跟随其他内容。第二行为碱基序列,通常是由acgtn组成的字符串,极少数情况下会出现其他字符。第四行为质量值,长度与第二行相同,指代每个碱基的测序可信度,有两种质量值系统,分别从!和@开始,常见范围是40个字符以内。

最早的压缩方法是使用压缩工具进行压缩,如gzip,bzip2等,这种通用工具由于对fastq格式的特征利用不足,因此压缩率并不理想,唯一的优点就是性能表现可观。

在这之后,出现了专门压缩fastq文件的工具,但起初算法策略并不统一,比如seqdb和g-sqz都选择了将碱基序列和质量值结合编码的做法。seqdb用一个字节来同时存碱基和质量值的组合;g-sqz以<碱基,质量值>为单位,在统计频率之后进行了零阶霍夫曼编码。由于这种策略的压缩率很差,因而很快被摒弃,另一种将三个信息流独立压缩的做法成为了主流。

沿袭这种框架的开源工具很多,但算法不一而足。详细而言,id和质量值基本都是熵编码,也即利用信息之间的相似性进行去冗余,但碱基序列的压缩则比较复杂,在熵编码之外,因为存在参考基因组序列,许多序列能够比对到基因组上,因而可以被比对信息替换。这类开源工具中表现较为出色的有quip,fqzcomp,dsrc,lfqc等。

在压缩的文件读取方面,部分工具是串行读取文件,且不支持多线程,如quip、fastqz;部分工具是串行读取文件,但支持多线程,且多线程的线程数固定,因其采取了任务分割而非数据分割的方式,如fqzcomp,dualfqz;部分工具为并行读取,包括dsrc2、mfcompress、gtz等。并行读取的方式能匹配实际运行环境的cpu数目,因而效率要比其他两种模式高。在压缩的文件写入方面,大多数工具都只会生成一个结果文件,而少数工具会生成若干个结果文件(通常等于其分割信息流的数目),前者作为通行的方案选择,在便利程度和文件校验方面都占有优势。在解压的文件读取方面,对于压缩单线程或任务分割的工具来说,是串行读取的,而对于采用数据分割的工具来说,是并行读取的。在解压的文件写入方面,所有工具都采用的是串行写入的方式。

然而,压缩结果在与并行压缩结合时,必然会选择数据分块的方式进行编码和存储,而现有的工具,在存储数据时,并未利用数据分块的特点实现最佳的解压方法。如公开号为cn103559020a中解压的并行读取采用了双缓冲队列,其整体解压效率会受制于两个因素:文件读取和文件写入。在文件读取时,如果用单个线程来读取,再将文件内容分发给各个工作线程,则工作线程会有一定的等待时间。在文件写入时,因为要保证文件的一致性,因此各个线程需要轮流写入自己的解压数据,会造成很严重的线程阻塞。



技术实现要素:

针对上述现有技术的不足,本发明的目的是提供一种fastq文件的并行压缩和解压方法及系统,其有效地提高了fastq文件并行压缩和解压的效率,解决了压缩解压过程中工作线程阻塞的问题。

为实现上述目的,本发明提供了一种fastq文件的并行压缩和解压方法,包括以下步骤:s1将fastq文件切分成若干数据块;s2移动每个数据块首尾的文件偏移量,使每个数据块间首尾相衔;s3并行压缩各个数据块,每个数据块由一个工作线程独立压缩,并在压缩过程中记录每个数据块的索引信息;s4并行解压各个数据块,每个数据块由一个工作线程独立解压,并在解压过程中记录每个数据块的索引信息。

进一步,s1中fastq文件的切分方法,包括以下步骤:s1.1读取fastq文件的首行的首字符,若不为@则退出切分,若为@则进入下一步;s1.2根据预设值的大小,将文件切分成若干个大小相同的数据块,最后一个数据块小于等于预设值,切分后,每个数据块包含起始和结尾的文件偏移量。

进一步,s2中数据块首尾的文件偏移量的移动方法,包括以下步骤:s2.1对于某个数据块的起始文件偏移量开始,逐个读取字符,直至出现起始字符为@的行l,记录行l首字符的文件偏移量a;s2.2判断l+1行的起始字符是否为@,若是,则记录l+1行首字符的文件偏移量b,b为目标起始位置,若否,a为目标起始位置;s2.3数据块末尾的文件偏移量,即为下一个数据块的起始文件偏移量。

进一步,s3中对每个数据块进行并行压缩,包括若干个循环,每个循环都包括数据块编码和输出两个步骤;数据块编码的过程中,第x次循环编码时,将[(x-1)×n+1,......,x×n]个数据块分配给压缩过程的n个工作线程,各工作线程在完成各自的编码过程后,输出各自的结果码流。

进一步,输出的过程为:在第x次循环时,获取第x-1次循环输出后总的文件偏移量c,文件偏移量c为第x次循环的起始文件偏移量,设n个工作线程的结果码流的大小分别为l1,l2,......,ln,最先完成编码的工作线程i的起始文件偏移量为c,随后完成编码的工作线程j的起始文件偏移量为c+li,......,最后完成编码的工作线程z的起始文件偏移量为c+l1+l2......+ln-lz。

进一步,s3中的索引信息包括压缩结果索引信息和原始文件索引信息,压缩结果索引信息包括数据块压缩结果的大小以及压缩结果在文件中的偏移量;原始文件索引信息包括数据块的原始大小和数据块在原始文件中的偏移量。

进一步,s3中的索引信息包括压缩结果索引信息和原始文件索引信息,压缩结果索引信息包括数据块压缩结果的大小以及压缩结果在文件中的偏移量;原始文件索引信息包括数据块的原始大小和数据块在原始文件中的偏移量。

进一步,s4中在对各个数据块解压前,解压过程的各个工作线程获取压缩结果索引信息和原始文件索引信息,在并行解压过程中,各个工作线程均包括指向压缩文件的句柄fin和指向解压目标文件的句柄fout,其中fin用于读取压缩文件,fout用于对目标文件进行写入。

进一步,解压的过程为:在若干次循环中,每个工作线程各自分配到一个数据块,根据数据块的压缩偏移量和压缩大小,直接偏移到压缩文件指定的位置,读取指定大小的内容;工作线程根据数据块原始的偏移量,偏移到解压目标文件的指定位置,对解压内容进行写入。以上过程,线程间是解耦合的。

本发明还公开了一种fastq文件的并行压缩和解压系统,包括:数据块分割模块,用于将fastq文件切分成若干数据块;数据块首尾移动模块,用于移动数据首尾的文件偏移量,使数据块内都为完整的短读序列;压缩模块,用于根据短读序列的起始位置,对每个数据块进行并行压缩,在并行压缩过程中,压缩过程的每个工作线程对应一个数据块,并在压缩过程中记录每个数据块的索引信息;解压模块,用于对每个数据块进行并行解压,在并行解压过程中,解压过程的每个工作线程对应一个数据块,工作线程通过读取对应数据块的索引信息解压数据块中数据。

本发明由于采取以上技术方案,具有以下优点:

1、在压缩部分,本发明中技术方案使得工作线程能够在文件读取阶段解耦合,各自跳转到相应的文件位置开始压缩,在解压部分,本发明中技术方案使得工作线程能够在文件读取和文件写入阶段解耦合,各自跳转到相应的文件位置开始解压,然后各自跳转到解压文件的相应位置进行写入,有效避免线程顺序写入造成阻塞,使fastq文件数据的压缩和解压过程更加高效、可靠。

2、在压缩部分,本发明提出了输出顺序与原始文件顺序部不一致的并行压缩,使先编码完的工作线程中数据块优先输出,进一步减少了压缩过程中的等待时间,尤其对于数据量很大,需要进行多次循环的情况,可以有效降低压缩时间,显著提高压缩解压过程的效率。

附图说明

图1是本发明一实施例中fastq文件的并行压缩和解压方法的示意图;

图2是本发明一实施例中fastq文件的数据块模式的示意图;

图3是本发明一实施例中fastq文件的输出顺序与原始文件顺序一致的并行压缩过程的示意图;

图4是本发明一实施例中fastq文件的输出顺序与原始文件顺序部不一致的并行压缩过程的示意图;

图5是本发明一实施例中fastq文件的并行解压过程的示意图。

具体实施方式

为了使本领域技术人员更好的理解本发明的技术方向,通过具体实施例对本发明进行详细的描绘。然而应当理解,具体实施方式的提供仅为了更好地理解本发明,它们不应该理解成对本发明的限制。在本发明的描述中,需要理解的是,所用到的术语仅仅是用于描述的目的,而不能理解为指示或暗示相对重要性。

实施例一

本发明提供了一种fastq文件的并行压缩和解压方法,如图1所示,包括以下步骤:

s1将fastq文件切分成若干数据块,数据块包含完整的短读序列。

其中,分割数据块的方法是:将需要压缩的fastq文件以容量大小或序列条数切分成若干个数据块。在压缩过程中需要对数据块中数据进行编码,每个数据块中的数据独立进行编码。至于具体的编码方式、解码方式和编码器、解码器的选择不是本发明主要讨论的问题,故只要其功能正常,能满足本发明中的编码和解码需求即可用于本实施例。

如图2所示,为了实现高效并行的压缩解压过程,需要对每个数据块的索引信息进行保存。索引信息在数据块中的保存方式可以采用图2中模式1和模式2的方式。若采用模式1的方式,即在压缩过程中,将各个数据块的索引信息都统一集中在文件中的一处,通常各个数据块的索引信息都集中保存至所有数据块之前或者数据块之后,但也可以存储在文件的其它位置。因此在解压时主线程先读取这部分数据,通过读取这部分信息给解压过程的各个工作线程分配数据块。若采用模式2的方式,即在压缩过程中,将每个数据块的索引信息都保存在对应数据块的头部,因此,每解压一个数据块都要先读取这部分数据。

索引信息分为两类:压缩结果索引信息和原始文件索引信息。

压缩结果索引信息包括数据块压缩结果的大小以及压缩结果在文件中的偏移量,二者可以互相换算,具体而言,某数据块的偏移量信息等于文件头部信息与前面所有数据块大小之和,因此,只记录压缩结果的大小和偏移量中的一项也可以实现索引功能。如果出于复杂度优先的考虑,可只保留其中一项,如果出于性能优先的考虑,则可同时记录两者。在记录压缩结果索引后,解压的工作线程即可通过压缩结果索引信息来快速定位到目标位置,并获取目标数据块的大小,进行解压。

原始文件索引信息包括数据块的原始数据的大小和数据块在原始文件中的偏移量,原始数据大小和偏移量可以互相换算,如果出于复杂度优先的考虑,可只保留其中一项,如果出于性能优先的考虑,则可同时记录两者。在记录原始文件索引后,解压的工作线程即可在写入文件时解耦合,通过原始文件索引信息来快速定位到解压结果文件的写入位置,各自独立写入。

s2移动每个数据块首尾的文件偏移量,使每个数据块间首尾相衔

由于原文件要切分成若干个数据块,而每个数据块独立编码,这就需要每个数据块的头部和尾部都需要包含完整的短读序列,因此,需要在将文件切分为若干数据块后进行短读序列起始位置的查找。fastq文件以四行为一个短读序列,即fastq文件的一个基本结构即为一个短读序列。

移动每个数据块首尾的文件偏移量的方法,包括以下步骤:

s2.1读取fastq文件的首行的首字符,若不为@退出查找,若为@则进入下一步;

s2.2根据接收的文件偏移量,定位到查找的起始位置;

s2.3从起始位置开始逐个读取字符,直至出现以@开头的行l,记录行l的行号和行l中@在文件中的位置a;

s2.4判断下一行的起始字符是否为@,若是记录l+1行中@在文件中的位置b,位置b为目标起始位置,若否位置a为目标起始位置。

其中,文件偏移量是指从指定位置向前或向后移动的字节数,用于从文件中找到所用数据的位置,通常偏移量分三种,第一种是从文件开头向后移动若干字节来寻找目标,第二种是从文件结尾向前移动若干字节找到目标,第三种是相对位置,是从文件当前位置向前或向后移动寻找。本文中所有的文件偏移量都是第一种文件偏移量。

s3根据短读序列的起始位置,对每个数据块进行并行压缩,在并行压缩过程中,压缩过程的每个工作线程对应一个数据块,并在压缩过程中记录每个数据块的索引信息。每个工作线程单独对数据块进行编码。根据编码器的不同,编码过程各异,只需要保证数据之间的编解码独立,无相互依赖或影响即可。

首先介绍的是,每次循环都等待所有线程完成编码的形式。

其中,对每个数据块进行并行压缩包括若干个循环,每个循环都包括数据块编码和输出两个步骤;数据块编码的过程中,设最大工作线程数量为nmax,空闲工作线程数量为n,则在这种形式下nmax=n,待压缩文件包含数据块的数量为m,则在第x次循环编码时,将[(x-1)×n+1,......,x×n]个数据块分配给压缩过程的n个工作线程,各工作线程在完成各自的编码过程后,输出各自的结果码流。其中,x×n小于等于m。

在输出环节,因为数据块内容的差异,各工作线程对数据块编码的时间必然不同,从而导致工作线程完成编码的顺序与原始的工作线程顺序不一样,也就是说第一个工作线程不一定是最先完成编码的工作线程。也不是原始文件中位置越靠前的数据块完成编码过程越快。因此根据是否将各数据块的结果码流按照其在原始文件中的顺序进行排布,将输出的过程分为两种,第一种是输出顺序与原始文件顺序一致的输出,第二种是输出顺序与原始文件顺序不一致的输出。

对于第一种输出,其输出的过程,如图3所示,包括:在第x次循环时,在n个工作线程完成编码后,获取各个工作线程输出的结果码流的大小和第x-1次循环输出后总的文件偏移量c,设n个工作线程的结果码流的大小分别为l1,l2,......,ln,则工作线程1的起始文件偏移量为c,工作线程2的起始文件偏移量为c+l1,......,工作线程n的起始文件偏移量为c+l1+l2......+ln-1。只要给各个工作线程都赋予各自独立的文件句柄,即可在输出环节使各工作线程各自移动文件句柄到相应位置进行独立输出,可以在一定程度上减少工作线程的等待时间,但不能从根本上解决工作线程等待的问题。此外,需要说明的是,本方案并不一定要等到所有的线程都结束编码才开始输出,为了尽量减少等待时间,可以在前n个线程都完成编码后就基于寻找文件偏移量的方法,先处理前n个工作线程。这种方式对于在原始文件中位置靠前的数据块编码较快的情况比较适合。

在一次循环中,如果要消除数据块靠后的工作线程的等待时间,就需要采用第二种输出方法,其输出的过程,如图4所示,包括:在第x次循环时,获取第x-1次循环输出后总的文件偏移量c,设n个工作线程的结果码流的大小分别为l1,l2,......,ln,最先完成编码的工作线程i的起始文件偏移量为c,随后完成编码的工作线程j的起始文件偏移量为c+li,......,最后完成编码的工作线程z的起始文件偏移量为c+l1+l2......+ln-lz。如图4所示,此方法需要额外记录工作线程完成编码的顺序,等到所有的数据块均完成编码输出后,将输出结果按照原文件顺序排列。与保证原文件顺序的输出方式相比,本输出方式用时更短,压缩效率更高。此外,额外记录每次循环的顺序,也可以将原始文件的索引信息,根据当前循环的输出顺序,进行调整,如图4所示,在原始文件的索引数据中,就以数据块3,1,4,2的顺序进行记录。

需要说明的是,在最后一次循环时,工作线程数量可能会小于n,此时只要按照实际数据块的数据进行工作线程任务分配即可。此外,经过压缩过程获得的压缩文件不仅包括数据块信息,也包括数据块的索引信息。

以上是每次循环都等待nmax个线程都完成编码的形式,而基于上文中“第二种输出方法”,还可以实现压缩过程所有线程完全解耦合的形式,即空闲线程数n=1的实现方式。

其中,对每个数据块进行并行压缩,包括起始准备、等待线程编码完成、线程输出和数据块分配这四个步骤;在起始准备过程中,设最大工作线程数量为nmax,则给这nmax个工作线程分配各自的数据块,然后各自开始编码工作,直到有线程完成编码,则令其立即输出到上一个压缩数据块的末尾(若为第一个完成的工作线程,则是输出文件的开头),并记录当前工作线程的压缩结果索引信息和原始文件索引信息(以供下一个工作线程及解压阶段使用),在工作线程输出结束后,分配下一个待压缩的数据块,并重复该循环,直至所有数据块都压缩完毕。

s4对每个数据块进行并行解压,在并行解压过程中,解压过程的每个工作线程对应一个数据块,工作线程通过读取对应数据块的索引信息解压数据块中数据。

在对各个数据块解压前,解压过程的各个工作线程获取压缩结果索引信息和原始文件索引信息,在并行解压过程中,各个工作线程均包括指向压缩文件的句柄fin和指向解压目标文件的句柄fout,其中fin用于读取压缩文件,fout用于对目标文件进行写入。由于每个工作线程都包括压缩文件的句柄fin,所以各个工作线程可以并行读取压缩文件,每个工作线程只处理与该工作线程需要相关的数据块。同时由于每个工作线程都包括解压目标文件的句柄fout,并且在写入内容时,各个工作线程的文件偏移量互不重叠,所以可以实现各个工作线程的并行写入目标文件。

如图5所示,解压过程的各工作线程都开启一个循环,循环的下限是0,循环的上限是整个压缩文件的数据块的数目。在循环里计算数据块的序号和工作线程总数的模,如果模运算结果等于工作线程的线程序号,则由工作线程来处理数据块,否则继续循环计算;该工作线程为与数据块对应的工作线程,该工作线程通过数据块序号可以直接获取数据块信息,然后根据数据块信息中的压缩偏移量和压缩大小,直接偏移到压缩文件指定的位置,读取指定大小的内容,该工作线程把读取的压缩内容进行还原处理,得到原始文件内容;该工作线程根据数据块原始的偏移量,偏移到解压目标文件的指定位置,对原始文件进行写入。

本实施例中技术方案在压缩时,不同于现有技术中压缩只能通过单个线程读取整个输入文件并进行数据分发的方式,采用多个线程并行压缩的方式,使得工作线程能够在文件读取阶段解耦合,各自跳转到相应的文件位置开始压缩,使得压缩效率显著提高。在解压部分时,不同于现有技术中解压只能通过单个线程读取整个输入文件,按照顺序写入的方式,使得工作线程能够在文件读取和文件写入阶段解耦合,各自跳转到相应的文件位置开始解压,然后各自跳转到解压文件的相应位置进行写入,有效避免了写入时造成阻塞。

实施例二

基于相同的发明构思,本实施例还公开了一种fastq文件的并行压缩和解压系统,包括:

数据块分割模块,用于将fastq文件切分成若干数据块,数据块包含完整的短读序列;

数据块首尾移动模块,用于移动每个数据块首尾的文件偏移量,使每个数据块间首尾相衔;

压缩模块,用于并行压缩各个数据块,每个数据块由一个工作线程独立压缩,并在压缩过程中记录每个数据块的索引信息;

解压模块,用于并行解压各个数据块,每个数据块由一个工作线程独立解压,并在解压过程中记录每个数据块的索引信息。

上述内容仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1