双缓冲模型实现大规模数据库聚类方法及系统与流程

文档序号:21469731发布日期:2020-07-14 16:54阅读:183来源:国知局
双缓冲模型实现大规模数据库聚类方法及系统与流程

本发明属于数据处理技术领域,尤其涉及双缓冲模型实现大规模数据库聚类方法及系统。



背景技术:

本部分的陈述仅仅是提供了与本公开相关的背景技术信息,不必然构成在先技术。

基因测序数据正在以更大的速度翻倍,从而在分析基因以及健康数据的生物学大数据研究中最突出的核心问题就是数据量极大。

对于基因组的处理,就是基于基因组序列的匹配操作。对于这些数据而言,进行基因组匹配在算法上并不是特别困难的事情。然而,现在需要操作的数据是tb甚至更大级别的,换句话说,普通的机器内存中根本承载不了这么多的数据。而且对于庞大的基因数据而言,很多算法以及相关的处理也是基于除去冗余序列而进行的操作。

生物基因序列上的聚类算法操作是基于相似基因的最大精确匹配算法(maximalexactmatches,mems)来计算基因序列之间的距离。

生物基因序列处理操作,很大程度上是因为有很多冗余序列,这些序列并不代表基因多样性或者物种和蛋白质的多样性。换句话说,如此海量的数据在基因代表性中并不都是有用的。当两条序列精确匹配相似度达到某个阈值的时候,就认为这两条序列属于同一个类别,其中一条为代表序列(representquery),另外一条为冗余序列(redundantquery)。在生物意义上,默认一个类别中最长的那一条序列最具代表性,为代表序列。

本申请所要解决的技术问题是:在数据量过大的情况下,待处理的数据的读取较为耗时,如何采用双缓冲的方法在精确匹配求解相似度的程序中并行实现计算和数据读取,以计算来掩盖数据读取的时间。



技术实现要素:

为克服上述现有技术的不足,本发明提供了双缓冲模型实现大规模数据库聚类方法,针对大规模数据文件的i/o操作,利用双缓冲多线程实现。

为实现上述目的,本发明的一个或多个实施例提供了如下技术方案:

双缓冲模型实现大规模数据库聚类方法,包括:

针对基因序列数据库进行长度递减排序;

在内存中建立两个缓冲区,每个缓冲区的大小和块大小相等,将整个基因序列文件预先载入两个缓冲区;

构建匹配字典:稀疏后缀数组,将一条基因序列构建稀疏后缀数组,作为字典,其它基因序列与字典后缀数组进行匹配,匹配过程中在查询序列的某个位置采取二分查找匹配搜索,并采取逆后缀数组、最小公共子前缀数组、后缀链接进行处理,实现生物基因序列的聚类,匹配过程所得到的相似度达到阈值,即判定为冗余序列。

进一步的技术方案,在两条序列进行相似度匹配的时候,默认较长的一条为代表序列,较短的一条为冗余序列,排序之后的第一条一定是代表序列,下边与其相似度到达阈值的被标记为它的冗余序列。

进一步的技术方案,将整个基因序列文件分为多个块;

将整个基因序列文件预先载入两个缓冲区,然后基于其中一个缓冲区中的数据进行计算操作的同时另一个缓冲区载入文件,然后进行相应的同步策略,在计算时间远大于i/o时间的情况下,实现计算时间对i/o时间的覆盖。

进一步的技术方案,设定缓冲区的大小及边界,每个缓冲区数据的实际大小是比设定的大小界限是要大一点的,多出不到一条序列的长度。

进一步的技术方案,i/o操作与mem-check的计算操作两者之间的同步时:创建一个线程进行读取文件到缓冲的操作,然后创建一组线程进行mem-check的计算工作,通过设置同步信号量full和empty来具体实现同步。

进一步的技术方案,针对于n条序列,创建k个线程分别进行计算,n远大于k,每个线程计算的序列索引号为k对于n模运算取余,这样每个线程分得的索引号是固定的。

进一步的技术方案,在同一个缓冲块中的多条query序列,用最长的计算时间来掩盖次长的计算时间,减少整体水平上的等待时间。

进一步的技术方案,预先将query源文件进行排序操作,使得其中的数据序列按照长度递减排列,每个线程所分得的数据长度都是相近的,最大精确匹配算法的计算时间与query长度呈正相关,从而使得各个线程之间的运行时间相差不大,整体运行时间趋于平均时间而非最坏情况下运行时间。

进一步的技术方案,块的大小为动态调度,其中每一个块的大小仅仅设置一个参考值而不是固定大小,在读入操作达到块大小的情况下判断是否读入的序列条数为线程数目的整数倍,如若不是,继续读入知道满足条数为线程数目整数倍的情况为止。

本发明还公开了双缓冲模型实现大规模数据库聚类系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤,包括:

针对基因序列数据库进行长度递减排序;

构建匹配字典:稀疏后缀数组,将一条基因序列构建稀疏后缀数组,作为字典,其它基因序列与字典后缀数组进行匹配,匹配过程中在查询序列的某个位置采取二分查找匹配搜索,并采取逆后缀数组、最小公共子前缀数组、后缀链接进行优化提升,计算所得到的匹配值达到阈值之后,即判定为冗余序列。

以上一个或多个技术方案存在以下有益效果:

基于大规模数据库生物基因序列的聚类操作以及去除冗余基因序列操作都会用到针对基因序列的精确匹配操作,并且针对大规模数据文件的i/o操作,双缓冲多线程并行操作能够实现上述情况下的数据快速处理。

本申请双缓冲模型针对大规模数据的处理过程中通过并行方式以计算时间掩盖数据i/o时间。

预先排序,并且模运算取余操作可以使得各个计算线程之间达到负载均衡。

本申请块的大小动态调度,使得每个计算线程分配到的序列条数相等,序列长度相似,从而每个线程的任务大体相同,达到负载均衡。本申请所提及的负载均衡主要是指:尽可能让每个线程的工作量相近,这样可以最大限度提高并行度,而不是某个线程非常忙而其他线程非常闲,结果是多数线程等待一个忙的线程结束,从而并行度不好,对计算资源的利用率低,耗时较多。

附图说明

构成本发明的一部分的说明书附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。

图1为本发明实施例外存直取数据read-file示意图;

图2为本发明实施例预先读入内存——load-all操作示意图;

图3(a)-图3(b)为本发明实施例双缓冲double-buffer示意图;

图4为本发明实施例进程间的同步处理示意图;

图5为本发明实施例块中不同线程运行时间展示图;

图6为本发明实施例块中乱序状态下的负载不均问题示意图;

图7为本发明实施例负载均衡处理示意图;

图8为本发明实施例基于每个缓冲块线程数目以及query序列数目的设定示意图;

图9为本发明实施例针对负载不均的时间结果分析示意图;

图10为本发明实施例三种模型下的运行时间比较示意图。

具体实施方式

应该指出,以下详细说明都是示例性的,旨在对本发明提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本发明所属技术领域的普通技术人员通常理解的相同含义。

需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本发明的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。

在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。

实施例一

本实施例公开了双缓冲模型实现大规模数据库聚类算法,mems最大精确匹配算法的大体流程:

针对基因序列数据库进行长度递减排序。在两条序列进行相似度匹配的时候,默认较长的一条为代表序列,较短的一条为冗余序列。所以,排序之后的第一条一定是代表序列,下边与其相似度到达阈值的被标记为它的冗余序列。

算法的实现需要先构建匹配字典,具体实现方式是稀疏后缀数组(sparsesuffixarray,ssa),将一条基因序列构建稀疏后缀数组,作为字典,其它基因序列与字典后缀数组进行匹配,匹配过程中在查询序列的某个位置采取二分查找匹配搜索,并采取逆后缀数组(inversesuffixarray,isa)、最小公共子前缀数组(longestcommonprefix,lcp)、后缀链接(suffixlinks)等进行优化提升,计算所得到的匹配值达到阈值之后,即判定为冗余序列。

基因序列聚类算法的基本操作是一条序列去搜索一个非常大的序列数据库。前边的序列位于参考文件(ref文件)中,后边的数据库即为query文件。算法的执行过程中进行匹配计算的两条序列都是要放到内存中去的。ref文件一般是某一条序列或者几条序列,相对于query文件来讲是比较小的,一般就采用直接读入内存,然后在源数据处理的时候直接在内存中去取的方法。对于query文件,如果内存够大,可以一次性载入到内存,也可以采取load-all的方法。但是,当query文件比较大的时候,不能够载入内存的时候,就要考虑通过其他方式(外存直取数据或者双缓冲方式)来实现。

参见附图1所示,外存直取数据read-file:当所需要的源文件不能够完全在内存中装入的时候,可以考虑不将源数据预先调入内存,直接在源文件读取源数据,这样每次从文件中载入一条序列,每条序列都会有一次i/o操作,这样可以实现在源数据文件比较大的时候,能够使得对于mem-check的计算操作能够继续进行。但是这也带来了一个很大的问题:每次取一条数据都要进行一次读取文件操作,这样频繁的i/o调用会产生很大的开销。

参见附图2所示,预先读入内存——load-all操作:实验的初始阶段,考虑到当源query数据文件不是特别大,在内存中可以装得下情况下,可以考虑现将源数据文件一次性读入到内存(load-all),之后的计算过程提取数据直接在内存中进行,这样可以避免大频率的i/o操作。但是,这样也会带来一次将文件读入内存所产生的开销。相对应频繁的i/o操作来讲,这方面的开销并不是太大的问题。这种预先将源数据文件读入内存方式的最大瓶颈在于:它仅限于文件大小小于内存大小,否则就不能将整个文件读入内存。所以,这种方法的虽然较为高效,但是瓶颈较为明显,并不适合所有的处理情况。

双缓冲double-buffer思想的产生:基于以上两种情况,提出一种在调入内存中数据量的大小方面比较折中而且实现起来更加高效的实现方式——双缓冲(doublebuffer)方式。

参见附图3(a)-附图3(b)所示,双缓冲的精髓在于:将整个文件分为多个块(block),然后在内存中建立两个缓冲区,每个缓冲区的大小和块大小相等。将文件预先载入这两个缓冲区,然后基于其中一个缓冲区中的数据进行计算操作的同时另一个缓冲区载入文件,然后进行相应的同步策略,在计算时间远大于i/o时间的情况下,实现计算时间对i/o时间的覆盖。

需要说明的是,一个文件中包含有多条基因序列数据,多的可以达到上百万条甚至上亿条。

具体来讲,两个缓冲区只载入两个块(前两个块),每个块(block)中包含多条基因序列。

将文件预先载入这两个缓冲区时,首先需要明确的是:计算所需的数据都是需要在内存中的。所以首先载入第一块到一个缓冲区中(内存中),然后对这个缓冲区中的数据(第一块数据)进行计算;在计算的过程中将第二块载入第二个缓冲区中,然后使用线程同步机制,等待第一个缓冲区中计算结束,然后再计算第二个缓冲区中的数据,同时将第三块载入第一个缓冲区中,……如此交替进行。除了第一块的读入内存,从第二块开始,读入内存的操作都是与上一块的计算并行的,相应的读取文件的时间被计算掩盖。

缓冲块(block)大小及边界处理:缓冲块的大小对于性能的有较为明显的影响。当缓冲块设置的比较大,等于文件大小的时候,双缓冲模型就类似于load-all模型;当缓冲块设置比较小,类似于每条序列大小的时候,双缓冲模型就类似于外存直取取数据模型。不同的块大小的设置导致块的数目在变化,从而导致以块为基本操作单位的总体开销也在变化。

每一个缓冲块界限的大小是固定的,在具体读入缓冲区的时候要注意相应的边界问题:比如说设定块的大小为20mb,在最后读入的一条序列的时候,序列的前半部分已经读入缓冲,如果加上后半部分就超出20mb,在这种情况下,我们进行的操作是将这一整条序列都读入缓冲区,这样才能够在后边的计算中进行有效的操作。所以事实上,每个缓冲区数据的实际大小是比设定的大小界限(举例中的20mb)是要大一点的(仅仅是多出不到一条序列的长度)。

参见附图4所示,进程间的同步处理:除了要处理好边界问题之外,另一个很重要的问题就是读文件的操作与计算操作之间的同步问题。为了使计算时间对i/o时间达到良好覆盖的目的,计算对于某个缓冲块的操作以及i/o对于另一个缓冲块的操作之间的同步问题一定要处理好,要保证两者之间的并行执行。如若是串行操作的话,不但不会提升性能,反而会使计算等待i/o的执行,再加上其他各种额外的开销会使得性能不升反降。

就单纯i/o操作与mem-check的计算操作两者之间的同步问题来看,这是一个比较典型的生产者——消费者同步模型。创建一个线程进行读取文件到缓冲的操作,然后创建一组线程进行mem-check的计算工作,通过设置同步信号量full和empty来具体实现同步。

块中不同线程运行时间展示图参见附图5所示,多线程模型,针对于n条序列(索引号为0到n-1),创建k个线程分别进行计算(n远大于k),每个线程计算的序列索引号为k对于n模运行取余,这样每个线程分得的索引号是固定的。我们的基本操作单位是block,针对于这一个block中的n条数据进行计算,有的线程会提前计算结束,有的线程有可能分到的序列长度都是比较长的,这就导致其他k-1个线程都在等待最慢的这个线程结束(如图6所示),从而结束对这整个block的操作,继而更改信号量,进行对下一个block的操作。所以,整个运行时间不是取决于平均运行时间,而是在于运行最慢的那个线程,这就是典型的负载不均问题。附图6展示了进行分块操作之后,以块为单位进行计算会使得这种负载不均得到放大。

参见附图7所示,针对负载不均提出数据预处理:采取了预先将query源文件进行排序操作,使得其中的数据序列按照长度递减排列。这样,每个线程所分得的数据长度都是相近的,最大精确匹配算法的计算时间与query长度呈正相关,从而使得各个线程之间的运行时间相差不大,整体运行时间趋于平均时间而非最坏情况下运行时间。(简单来讲,就是在同一个缓冲块中的多条query序列,用最长的计算时间来掩盖次长的计算时间,减少整体水平上的等待时间。)

参见附图8所示,基于每个缓冲块线程数目以及query序列数目的设定:除去对数据进行预处理排序以减少负载不均的影响,还有一个负载不均的问题:每一块中每个线程所分到的线程数目不同,导致序列数目间的负载不均。这种负载不均的问题在单条序列长度比较长的情况下尤为严重。例如创建的初始块大小为500m,创建一组(24个)线程对这一个块进行计算操作。会发现第一条序列长度就达到了500m,那么只有0号线程进行计算操作,其他线程都处于等待状态。这就类似于串行操作,对于性能有严重的影响。针对于这种情况,我们设计块的大小为动态调度,其中每一个块的大小仅仅设置一个参考值而不是固定大小,这样在读入操作达到块大小的情况下判断是否读入的序列条数为线程数目的整数倍,如若不是,继续读入知道满足条数为线程数目整数倍的情况为止。

参见附图9所示,针对负载不均的时间结果分析:针对于不同的块大小创建相同数目的线程运行排序前后的文件的运行时间的实验结果表明,负载不均对于程序的性能有极大的影响。通过实验结果可以看出,源数据排序之后的运行时间随着块大小的变化运行时间上下浮动不大,在线程创建开销以及相应的硬件资源的浮动范围之内,而没有经过排序的源文件的运行时间结果差异较大。

参见附图10所示,实验结果及性能分析:双缓冲的实现方式,并对于其对于不同的数据进行了相应的测试。实验结果中就i/o层面开看,提升效果还是很明显的,双缓冲模型性能明显优于直接在外存取数据(见图5:对于同样的的源数据文件,横轴是不同文件编号,纵轴是运行时间)。且如果创建较多数目的线程的时候,会发现基于同一个外存文件进行直接读取序列的操作,会导致处理时间急速上升,而双缓冲模型没有这方面的问题。

最终实验结果中,在文件较小的时候由于双缓冲那些固有的开销(创建回收大量线程、回收buffer空间)的影响所占比重可以被体现,但是这些开销相对于预先读入内存文件大小必须小于内存大小的瓶颈来讲要小得多。在某种意义上,可以认为预先读入内存是一种特殊的双缓冲模型,其block大小为整个文件大小。而且即使内存足够大,能够直接放下任意大小的文件,那么这种方式下一次性读入所有文件的操作与计算操作是串行的,一次性读入全部文件大小的操作时间相对于双缓冲模型下只是读入第一块的操作是串行开销(其余各块的读入操作都被计算掩盖)要高出许多。所以,就i/o方面的开销来讲,双缓冲模型是要优于直接预读入内存的模型的。并且通过最后一个数据点来看,即使在文件大小在内存范围之内,当文件大小接近内存大小的时候,由于各种计算过程也在内存中需要一定的空间,数据集占领较多的内存空间的时候,会导致性能急剧下降,运行时间超过外存直取数据模型。

实施例二

本实施例的目的是提供双缓冲模型实现大规模数据库聚类系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤,包括:

针对基因序列数据库进行长度递减排序;

构建匹配字典:稀疏后缀数组,将一条基因序列构建稀疏后缀数组,作为字典,其它基因序列与字典后缀数组进行匹配,匹配过程中在查询序列的某个位置采取二分查找匹配搜索,并采取逆后缀数组、最小公共子前缀数组、后缀链接进行优化提升,计算所得到的匹配值达到阈值之后,即判定为冗余序列。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。

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