基于任务驱动和双缓冲机制的并行排序方法

文档序号:6383031阅读:193来源:国知局
专利名称:基于任务驱动和双缓冲机制的并行排序方法
技术领域
本发明属于数据库技术领域,特别涉及一种基于任务驱动和双缓冲机制的并行排序方法。
背景技术
排序是计算机中经常进行的操作之一,其目的是将“无序”的记录调整为根据排序键“有序”的记录。排序分为内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序;反之,若排序的记录 数量很大,整个排序过程无法在内存中完成,则称此类排序为外部排序。排序也是数据库中非常重要的功能,其在数据库中的作用不可替代,使用非常普遍。除了用户指定的排序操作外,建立索引和对表进行聚簇都离不开排序,有些连接、聚集函数甚至集合操作的实现都需要借助排序。大数据时代已经到来,数据库中存储的数据量越来越大,对数据排序的时间也越来越长。当数据量大到一定程度以后,使用水平分区、垂直分区和压缩等技术,都无法将数据量降低到可以进行内部排序的程度。目前普通的排序算法对IGB的数据排序可以在内存中进行,只需要几秒钟时间;对于IOGB的数据排序,因无法全部装入内存而只能进行外部排序,时间就会增加到几分钟;对于100GB的数据排序需要数小时甚至更多的时间。一些在线交易系统一天就能产生几GB或者更多的数据,为了不影响在线应用的性能和保存历史数据,必须在交易系统压力不大时将在线数据导入结算系统中。以防在线交易系统受到影响,一般会选择某个晚上将一周或者一月的在线数据导入到结算系统中。结算系统为了提高查询性能,在数据入库前都需要建立聚簇索引,建立聚簇索引就需要排序,目前大部分数据库对几百GB数据排序都需要几小时,再加上数据入库的时间,难以保证在交易系统空闲时间内完成,这对于在线交易系统来说是致命的。因内存大小限制,大数据无法全部装入内存进行内部排序,因而需要外部排序。和内部排序相比,外部排序时,磁盘读写速度太低,整个排序过程中输入输出成为瓶颈。目前所有的数据库都有数据缓冲区和排序缓冲区,数据必须先从磁盘读入数据缓冲区,再从数据缓冲区拷贝到排序缓冲区才能进行排序,排序结束后再次拷贝到数据缓冲区才能写出到外存中,因拷贝动作都由排序线程完成,发生两次内存拷贝直接导致性能降低。更重要的是大部分数据库都是一次性将排序缓冲区填满以后再进行内存排序,导致中央处理器大部分时间都要等待输入输出完成,当中央处理器进行内存排序时输入输出又处于空闲状态,无法充分利用中央处理器和输入输出资源,以致排序性能低下。

发明内容
本发明的目的在于克服现有技术的不足,提供一种设计合理、速度快、效率高的基于任务驱动和双缓冲机制的并行排序方法。本发明解决其技术问题是采取以下技术方案实现的
一种基于任务驱动和双缓冲机制的并行排序方法,包括以下步骤步骤I :分块内存排序步骤将外存文件划分成一定大小的微小桶并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时,对所有微小桶进行内存归并,然后写出到外存中,形成一个有序的桶;步骤2 :外存归并步骤对外存中的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。而且,所述步骤I包括的具体步骤为⑴根据文件大小生成一个磁盘读任务,用于读取一个微小桶的数据到内存对应的排序缓冲区中,将此磁盘读任务添加到磁盘读线程的任务队列的队尾;
⑵再生成一个磁盘读任务,添加到磁盘读线程的任务队列的队尾;⑶等待前一个磁盘读任务的完成;⑷分析读入内存排序缓冲区的微小桶的数据,生成元组结构和指向元组的指针数组,产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;(5)循环执行⑵到⑷,直到没有更多的磁盘读任务或者没有更多的内存;(6)等待最后一个磁盘读任务的完成,然后分析最后一个微小桶的数据,再产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;(7)等待所有的快速排序任务完成;⑶生成一个内存归并任务,用于归并内存中所有的微小桶的数据到外存的桶中,并添加到快速排序线程组任务队列的队尾;⑶等待内存归并任务完成; (K))重复执行⑴到⑶,直到没有更多的数据。而且,所述磁盘读任务的处理方法为在指定的文件中,从指定的位置开始读取指定大小的数据块,存入指定的微小桶缓冲区中,输入输出完成以后给主线程发送磁盘读任务已经完成信号。而且,所述的快速排序任务的处理方法为对元组指针数组进行快速排序。而且,所述快速排序任务采用构造等价排序键以及多个排序键合并构造等价排序键的方式进行。而且,所述构造等价排序键的方法是将字符串等属性构造成能用8字节整数进行比较的排序键的过程。而且,所述的等价排序键包含排序键和该排序键在元组指针数组上的偏移。而且,所述内存归并包括以下步骤⑴在每一个微小桶中顺序地读取等价排序键,插入到最小堆/最大堆中,进行堆排序;⑵将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑶,否则就执行步骤(7);⑶添加一个磁盘写任务到磁盘写线程的任务队列的末尾;⑷等待预操作缓冲区的磁盘写任务完成;(5)转换工作缓冲区为预操作缓冲区,预操作缓冲区为工作缓冲区;(6)将没有写入到上一个工作缓冲区的数据写出到当前工作缓冲区中;
(7)从刚才写出的记录所在的微小桶中继续读取一条记录插入到堆中,如果此微小桶中没有更多数据,就执行⑶,否则就执行(9);(8)删除此微小桶,微小桶的个数减一;⑶调整最小堆;(K))循环执行步骤⑵到步骤(9)直到微小桶的个数减到O为止。而且,所述外存归并包括以下步骤⑴给每一个桶都生成一个磁盘读任务,并添加到磁盘读任务队列的末尾,用于从每个桶中读取一小块有序数据到桶的工作缓冲区;
⑵等待磁盘读任务执行结束,生成给该桶的预操作缓冲区读入数据的磁盘读任务,添加到磁盘读任务队列末尾;⑶分析读入到工作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;⑷循环执行步骤⑵和步骤⑶,直到每个桶的工作缓冲区都读入了数据;(5)顺序的从每一个桶中读取一条记录,插入到最小堆/最大堆中,进行堆排序;(6)将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤(7),否则就执行步骤(11);(7)添加一个磁盘写任务到磁盘写线程的任务队列的末尾;(8)等待预操作缓冲区的磁盘写任务完成;⑶交换工作缓冲区和预操作缓冲区;(1Φ将上一个工作缓冲区没有写入的数据写到当前工作缓冲区中;(11)从刚才写出的记录所在的桶的内存中继续读取一条记录插入到堆中,如果此桶的内存中没有更多数据就执行步骤(12),否则就执行(17);(12)如果此桶的外存中还有数据,就生成磁盘读任务,继续读取此桶的下一块数据,否则标记此桶没有更多的数据;是否在一个桶在内存中数据少于一定数量就提前进行异步输入输出,以使磁盘输入输出和中央处理器并行;(13)如果此桶没有更多数据,就执行(14),否则等待此桶的预操作缓冲区磁盘读任务结束,执行步骤(15);(M)删除此桶,桶的个数减一;(15)分析读入预操作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;(16)交换此桶的预操作缓冲区和工作缓冲区;(17)调整最小堆;(18)循环执行步骤(6)到步骤(17)直到桶的个数减到O为止。本发明的优点和积极效果是本发明通过任务驱动多线程工作,简化了并发控制的机制;并利用双缓冲技术在中央处理器处理任务之前都给磁盘分配了异步输入输出任务以充分地利用输入输出资源;同时,通过构造等价排序键和优化内部排序算法,提高内部排序的性能,加快了处理速度,增加了大数据量排序算法的可扩展性。


图I是本发明的微小桶和桶的划分和数据流动过程示意图;图2是本发明的任务产生、执行和数据移动过程示意图;图3是本发明的微小桶数据、元组结构和元组指针数组结构示意图;图4是本发明的等价排序键的构造方法示意图;图5是本发明的内存归并工作流程图;图6是本发明的外存归并工作流程图。
具体实施例方式以下结合附图对本发明实施例做进一步详述一种基于任务驱动和双缓冲机制的并行排序方法,如图I所述,包括顺序执行的分块内存排序任务和外存归并任务。所述的分块内存排序任务是将外存文件划分成100MB大小的微小桶(MicroRun)并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时应该已经读入了 Iii个微小桶(i从I到N,N表示最终将形成的桶的个数),对此Iii个微小桶进行内存归并以后写出到外存中,形成一个有序的桶(Run);当所有的微小桶都被内存归并写出到外存后,就会在外存中形成N块有序的桶,分别是桶I、桶2、…、桶N,至此分块内存排序任务就完成了。所述的外存归并任务是对外存中的N个有序的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。本排序方法是在外存文件被划分后,将每一个微小桶都加载到内存进行内部排序。如果将有序的微小桶直接写出到外存,外存归并阶段的桶个数过多,导致外存归并的磁盘读取过程发生频繁的磁头移动而严重影响输入输出性能,因此,必须先将内存的微小桶进行归并以后,形成一个较大的桶,再写出到外存中。还通过构造等价排序键,优化快速排序算法来提高内部排序的性能;通过任务驱动、AIO和双缓冲机制等技术来充分利用系统资源。本排序方法是以计算机多线程调度方式的。并行线程都争夺主线程分配的任务并执行,在争夺了一段时间都没有任务时,就放弃中央处理器进入睡眠状态。这种方式一方面可以及时地执行分配的任务,另一方面可以防止没有任务时浪费中央处理器资源。任务处理线程的执行逻辑如下I、一直尝试从任务队列上获取一个任务;2、如果尝试100000次都没有得到可以执行的任务,就放弃中央处理器,睡眠IOms ;3、如果拿到一个任务,就开始执行此任务;4、通知任务分配线程,任务已经完成;5、循环执行I到4,直到排序结束为止;一种基于任务驱动和双缓冲机制的并行排序方法,如图2所示,包括以下步骤步骤I :分块内存排序步骤由主线程执行分块内存排序任务。分块内存排序任务又可以被细化为磁盘读任务、快速排序任务、内存归并任务和磁盘写任务,主线程生成这些任务和对这些任务的操作步骤如下⑴根据文件大小生成一个磁盘读任务,用于读取一个微小桶的数据到内存对应的排序缓冲区中,将此磁盘读任务添加到磁盘读线程的任务队列的队尾;⑵再生成一个磁盘读任务,添加到磁盘读线程的任务队列的队尾;⑶等待前一个磁盘读任务的完成;⑷分析读入内存排序缓冲区的微小桶的数据,生成元组结构和指向元组的指针数组,产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾; (5)循环执行⑵到⑷,直到没有更多的磁盘读任务或者没有更多的内存;(6)等待最后一个磁盘读任务的完成,然后分析最后一个微小桶 的数据,再产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;(7)等待所有的快速排序任务完成;⑶生成一个内存归并任务,用于归并内存中所有的微小桶的数据到外存的桶中,并添加到快速排序线程组任务队列的队尾;⑶等待内存归并任务完成;(K))重复执行⑴到⑶,直到没有更多的数据。其中磁盘读任务的任务属性包括文件句柄、输入输出起始位置在数据文件中的偏移字节数、输入输出数据大小字节数、内存微小桶缓冲区指针和信号量。磁盘读任务的功能是驱动读线程开始工作。磁盘读任务的执行步骤为在指定的文件中,从指定的位置开始读取指定大小的数据块,存入指定的微小桶缓冲区中,输入输出完成以后给主线程发送磁盘读任务已经完成信号。主线程接收到信号以后,分析此微小桶的数据,生成元组结构和指向元组的指针数组;主线程再根据分析得到的元组指针数组,构造快速排序任务。微小桶数据、分析得到的元组结构和元组指针数组如下图3所示。快速排序任务的任务属性包括元组指针数组(由主线程分析微小桶的数据得到)、元组个数和信号量。快速排序任务的功能是驱动快速排序线程组开始工作,快速排序任务只需要对元组指针数组进行快速排序,不需要移动数据。如果在磁盘读写是瓶颈的机器上,读取100MB数据的时间远远超过对此排序的时间,只需要一个快速排序线程就可以完成快速排序任务;但如果在磁盘读写性能较好的机器上,读取100MB的数据只需要几百毫秒,这时候对100MB数据的排序时间可能就会超过输入输出时间,所以快速排序需多个线程完成,还需要提高快速排序的性能。本发明为了提高快速排序的性能,对快速排序做了如下两点改进( I)构造等价排序键,降低比较的成本比较两个字符串大小的时,只能从前往后挨个字节比较,直到出现不相等的字节为止,如果排序键字符串较长,排序的时间全部消耗在字符串比较函数中。为了提高字符串排序的性能,本发明将要排序的字符串构造成等价的排序键,排序过程中按照等价排序键比较,等价排序键一次会比较8个字节,提高了快速排序的性能。(2)多个排序键合并构造等价排序键,降低比较的成本数据库中经常存在根据多个属性排序的情况,比如建立组合索引。普通的排序算法会先调用第一个属性的比较函数,如果第一个属性相等时再调用第二个属性的比较函数确定排序键的大小。这增加了一次函数调用,因快速排序过程中比较发生的非常频繁,增加一次函数调用性能就会降低很多。所以将多个排序键合并成一个等价的排序键,直接调用等价排序键的比较函数确定大小,提高了快速排序的性能。如图4所示,等价排序键的构造方为将字符串等属性构造成能用8字节整数进行比较的排序键的过程,等价排序键中包含了排序键和此排序键在元组指针数组上的偏移。经过优化以后的排序快速排序算法,对gensort生成的数据进行排序和优化前的快速排序算法的性能比较,可以看到性能提高了一倍
权利要求
1.一种基于任务驱动和双缓冲机制的并行排序方法,其特征在于包括以下步骤 步骤I:分块内存排序步骤将外存文件划分成一定大小的微小桶并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时,对所有微小桶进行内存归并,然后写出到外存中,形成一个有序的桶; 步骤2 :外存归并步骤对外存中的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。
2.根据权利要求I所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述步骤I包括的具体步骤为 ⑴根据文件大小生成一个磁盘读任务,用于读取一个微小桶的数据到内存对应的排序缓冲区中,将此磁盘读任务添加到磁盘读线程的任务队列的队尾; ⑵再生成一个磁盘读任务,添加到磁盘读线程的任务队列的队尾; ⑶等待前一个磁盘读任务的完成; ⑷分析读入内存排序缓冲区的微小桶的数据,生成元组结构和指向元组的指针数组,产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾; (5)循环执行⑵到⑷,直到没有更多的磁盘读任务或者没有更多的内存; (6)等待最后一个磁盘读任务的完成,然后分析最后一个微小桶的数据,再产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾; (7)等待所有的快速排序任务完成; (8)生成一个内存归并任务,用于归并内存中所有的微小桶的数据到外存的桶中,并添加到快速排序线程组任务队列的队尾; (9)等待内存归并任务完成; (10)重复执行⑴到⑶,直到没有更多的数据。
3.根据权利要求2所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述磁盘读任务的处理方法为在指定的文件中,从指定的位置开始读取指定大小的数据块,存入指定的微小桶缓冲区中,输入输出完成以后给主线程发送磁盘读任务已经完成信号。
4.根据权利要求2所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述的快速排序任务的处理方法为对元组指针数组进行快速排序。
5.根据权利要求4所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述快速排序任务采用构造等价排序键以及多个排序键合并构造等价排序键的方式进行。
6.根据权利要求5所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述构造等价排序键的方法是将字符串等属性构造成能用8字节整数进行比较的排序键的过程。
7.根据权利要求6所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述的等价排序键包含排序键和该排序键在元组指针数组上的偏移。
8.根据权利要求I或2所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述内存归并包括以下步骤 ⑴在每一个微小桶中顺序地读取等价排序键,插入到最小堆/最大堆中,进行堆排序; ⑵将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑶,否则就执行步骤(7); ⑶添加一个磁盘写任务到磁盘写线程的任务队列的末尾; ⑷等待预操作缓冲区的磁盘写任务完成; (5)转换工作缓冲区为预操作缓冲区,预操作缓冲区为工作缓冲区; (6)将没有写入到上一个工作缓冲区的数据写出到当前工作缓冲区中; (7)从刚才写出的记录所在的微小桶中继续读取一条记录插入到堆中,如果此微小桶中没有更多数据,就执行(8),否则就执行(9); ⑶删除此微小桶,微小桶的个数减一; (9)调整最小堆; (10)循环执行步骤⑵到步骤(9)直到微小桶的个数减到O为止。
9.根据权利要求I或2所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于所述外存归并包括以下步骤 ⑴给每一个桶都生成一个磁盘读任务,并添加到磁盘读任务队列的末尾,用于从每个桶中读取一小块有序数据到桶的工作缓冲区; ⑵等待磁盘读任务执行结束,生成给该桶的预操作缓冲区读入数据的磁盘读任务,添加到磁盘读任务队列末尾; ⑶分析读入到工作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组; ⑷循环执行步骤⑵和步骤(3),直到每个桶的工作缓冲区都读入了数据; (5)顺序的从每一个桶中读取一条记录,插入到最小堆/最大堆中,进行堆排序; (6)将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤(7),否则就执行步骤(11); (7)添加一个磁盘写任务到磁盘写线程的任务队列的末尾; ⑶等待预操作缓冲区的磁盘写任务完成; ⑶交换工作缓冲区和预操作缓冲区; (10)将上一个工作缓冲区没有写入的数据写到当前工作缓冲区中; (11)从刚才写出的记录所在的桶的内存中继续读取一条记录插入到堆中,如果此桶的内存中没有更多数据就执行步骤(12),否则就执行(17); (12)如果此桶的外存中还有数据,就生成磁盘读任务,继续读取此桶的下一块数据,否则标记此桶没有更多的数据;是否在一个桶在内存中数据少于一定数量就提前进行异步输入输出,以使磁盘输入输出和中央处理器并行; (13)如果此桶没有更多数据,就执行(14),否则等待此桶的预操作缓冲区磁盘读任务结束,执行步骤(15); (14)删除此桶,桶的个数减一; (15)分析读入预操作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组; (16)交换此桶的预操作缓冲区和工作缓冲区; (17)调整最小堆; 側循环执行步骤(6)到步骤(17)直到桶的个数减到O为止。
全文摘要
本发明涉及一种基于任务驱动和双缓冲机制的并行排序方法,其主要技术特点是包括步骤1分块内存排序步骤将外存文件划分成一定大小的微小桶并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时,对所有微小桶进行内存归并,然后写出到外存中,形成一个有序的桶;步骤2外存归并步骤对外存中的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。本发明通过任务驱动多线程工作并利用双缓冲技术提高内部排序的性能,简化了并发控制的机制,加快了处理速度,增加了大数据量排序算法的可扩展性。
文档编号G06F9/38GK102968496SQ20121051003
公开日2013年3月13日 申请日期2012年12月4日 优先权日2012年12月4日
发明者王效忠, 冯柯, 蒋志勇, 赵殿奎, 杨永亮, 张巍, 关刚, 孟勃荣 申请人:天津神舟通用数据技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1