CN102968496B - 基于任务驱动和双缓冲机制的并行排序方法 - Google Patents
基于任务驱动和双缓冲机制的并行排序方法 Download PDFInfo
- Publication number
- CN102968496B CN102968496B CN201210510033.1A CN201210510033A CN102968496B CN 102968496 B CN102968496 B CN 102968496B CN 201210510033 A CN201210510033 A CN 201210510033A CN 102968496 B CN102968496 B CN 102968496B
- Authority
- CN
- China
- Prior art keywords
- task
- bucket
- data
- disk
- merger
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种基于任务驱动和双缓冲机制的并行排序方法,其主要技术特点是:包括步骤1:分块内存排序步骤:将外存文件划分成一定大小的微小桶并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时,对所有微小桶进行内存归并,然后写出到外存中,形成一个有序的桶;步骤2:外存归并步骤:对外存中的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。本发明通过任务驱动多线程工作并利用双缓冲技术提高内部排序的性能,简化了并发控制的机制,加快了处理速度,增加了大数据量排序算法的可扩展性。
Description
技术领域
本发明属于数据库技术领域,特别涉及一种基于任务驱动和双缓冲机制的并行排序方法。
背景技术
排序是计算机中经常进行的操作之一,其目的是将“无序”的记录调整为根据排序键“有序”的记录。排序分为内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序;反之,若排序的记录数量很大,整个排序过程无法在内存中完成,则称此类排序为外部排序。
排序也是数据库中非常重要的功能,其在数据库中的作用不可替代,使用非常普遍。除了用户指定的排序操作外,建立索引和对表进行聚簇都离不开排序,有些连接、聚集函数甚至集合操作的实现都需要借助排序。大数据时代已经到来,数据库中存储的数据量越来越大,对数据排序的时间也越来越长。当数据量大到一定程度以后,使用水平分区、垂直分区和压缩等技术,都无法将数据量降低到可以进行内部排序的程度。目前普通的排序算法对1GB的数据排序可以在内存中进行,只需要几秒钟时间;对于10GB的数据排序,因无法全部装入内存而只能进行外部排序,时间就会增加到几分钟;对于100GB的数据排序需要数小时甚至更多的时间。
一些在线交易系统一天就能产生几GB或者更多的数据,为了不影响在线应用的性能和保存历史数据,必须在交易系统压力不大时将在线数据导入结算系统中。以防在线交易系统受到影响,一般会选择某个晚上将一周或者一月的在线数据导入到结算系统中。结算系统为了提高查询性能,在数据入库前都需要建立聚簇索引,建立聚簇索引就需要排序,目前大部分数据库对几百GB数据排序都需要几小时,再加上数据入库的时间,难以保证在交易系统空闲时间内完成,这对于在线交易系统来说是致命的。
因内存大小限制,大数据无法全部装入内存进行内部排序,因而需要外部排序。和内部排序相比,外部排序时,磁盘读写速度太低,整个排序过程中输入输出成为瓶颈。目前所有的数据库都有数据缓冲区和排序缓冲区,数据必须先从磁盘读入数据缓冲区,再从数据缓冲区拷贝到排序缓冲区才能进行排序,排序结束后再次拷贝到数据缓冲区才能写出到外存中,因拷贝动作都由排序线程完成,发生两次内存拷贝直接导致性能降低。更重要的是大部分数据库都是一次性将排序缓冲区填满以后再进行内存排序,导致中央处理器大部分时间都要等待输入输出完成,当中央处理器进行内存排序时输入输出又处于空闲状态,无法充分利用中央处理器和输入输出资源,以致排序性能低下。
发明内容
本发明的目的在于克服现有技术的不足,提供一种设计合理、速度快、效率高的基于任务驱动和双缓冲机制的并行排序方法。
本发明解决其技术问题是采取以下技术方案实现的:
一种基于任务驱动和双缓冲机制的并行排序方法,包括以下步骤:
步骤1:分块内存排序步骤:将外存文件划分成一定大小的微小桶并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时,对所有微小桶进行内存归并,然后写出到外存中,形成一个有序的桶;
步骤2:外存归并步骤:对外存中的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。
而且,所述步骤1包括的具体步骤为:
⑴根据文件大小生成一个磁盘读任务,用于读取一个微小桶的数据到内存对应的排序缓冲区中,将此磁盘读任务添加到磁盘读线程的任务队列的队尾;
⑵再生成一个磁盘读任务,添加到磁盘读线程的任务队列的队尾;
⑶等待前一个磁盘读任务的完成;
⑷分析读入内存排序缓冲区的微小桶的数据,生成元组结构和指向元组的指针数组,产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;
⑸循环执行⑵到⑷,直到没有更多的磁盘读任务或者没有更多的内存;
⑹等待最后一个磁盘读任务的完成,然后分析最后一个微小桶的数据,再产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;
⑺等待所有的快速排序任务完成;
⑻生成一个内存归并任务,用于归并内存中所有的微小桶的数据到外存的桶中,并添加到快速排序线程组任务队列的队尾;
⑼等待内存归并任务完成;
⑽重复执行⑴到⑼,直到没有更多的数据。
而且,所述磁盘读任务的处理方法为:在指定的文件中,从指定的位置开始读取指定大小的数据块,存入指定的微小桶缓冲区中,输入输出完成以后给主线程发送磁盘读任务已经完成信号。
而且,所述的快速排序任务的处理方法为:对元组指针数组进行快速排序。
而且,所述快速排序任务采用构造等价排序键以及多个排序键合并构造等价排序键的方式进行。
而且,所述构造等价排序键的方法是将字符串等属性构造成能用8字节整数进行比较的排序键的过程。
而且,所述的等价排序键包含排序键和该排序键在元组指针数组上的偏移。
而且,所述内存归并包括以下步骤:
⑴在每一个微小桶中顺序地读取等价排序键,插入到最小堆/最大堆中,进行堆排序;
⑵将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑶,否则就执行步骤⑺;
⑶添加一个磁盘写任务到磁盘写线程的任务队列的末尾;
⑷等待预操作缓冲区的磁盘写任务完成;
⑸转换工作缓冲区为预操作缓冲区,预操作缓冲区为工作缓冲区;
⑹将没有写入到上一个工作缓冲区的数据写出到当前工作缓冲区中;
⑺从刚才写出的记录所在的微小桶中继续读取一条记录插入到堆中,如果此微小桶中没有更多数据,就执行⑻,否则就执行⑼;
⑻删除此微小桶,微小桶的个数减一;
⑼调整最小堆;
⑽循环执行步骤⑵到步骤⑼直到微小桶的个数减到0为止。
而且,所述外存归并包括以下步骤:
⑴给每一个桶都生成一个磁盘读任务,并添加到磁盘读任务队列的末尾,用于从每个桶中读取一小块有序数据到桶的工作缓冲区;
⑵等待磁盘读任务执行结束,生成给该桶的预操作缓冲区读入数据的磁盘读任务,添加到磁盘读任务队列末尾;
⑶分析读入到工作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;
⑷循环执行步骤⑵和步骤⑶,直到每个桶的工作缓冲区都读入了数据;
⑸顺序的从每一个桶中读取一条记录,插入到最小堆/最大堆中,进行堆排序;
⑹将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑺,否则就执行步骤⑾;
⑺添加一个磁盘写任务到磁盘写线程的任务队列的末尾;
⑻等待预操作缓冲区的磁盘写任务完成;
⑼交换工作缓冲区和预操作缓冲区;
⑽将上一个工作缓冲区没有写入的数据写到当前工作缓冲区中;
⑾从刚才写出的记录所在的桶的内存中继续读取一条记录插入到堆中,如果此桶的内存中没有更多数据就执行步骤⑿,否则就执行⒄;
⑿如果此桶的外存中还有数据,就生成磁盘读任务,继续读取此桶的下一块数据,否则标记此桶没有更多的数据;是否在一个桶在内存中数据少于一定数量就提前进行异步输入输出,以使磁盘输入输出和中央处理器并行;
⒀如果此桶没有更多数据,就执行⒁,否则等待此桶的预操作缓冲区磁盘读任务结束,执行步骤⒂;
⒁删除此桶,桶的个数减一;
⒂分析读入预操作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;
⒃交换此桶的预操作缓冲区和工作缓冲区;
⒄调整最小堆;
⒅循环执行步骤⑹到步骤⒄直到桶的个数减到0为止。
本发明的优点和积极效果是:
本发明通过任务驱动多线程工作,简化了并发控制的机制;并利用双缓冲技术在中央处理器处理任务之前都给磁盘分配了异步输入输出任务以充分地利用输入输出资源;同时,通过构造等价排序键和优化内部排序算法,提高内部排序的性能,加快了处理速度,增加了大数据量排序算法的可扩展性。
附图说明
图1是本发明的微小桶和桶的划分和数据流动过程示意图;
图2是本发明的任务产生、执行和数据移动过程示意图;
图3是本发明的微小桶数据、元组结构和元组指针数组结构示意图;
图4是本发明的等价排序键的构造方法示意图;
图5是本发明的内存归并工作流程图;
图6是本发明的外存归并工作流程图。
具体实施方式
以下结合附图对本发明实施例做进一步详述:
一种基于任务驱动和双缓冲机制的并行排序方法,如图1所述,包括顺序执行的分块内存排序任务和外存归并任务。所述的分块内存排序任务是将外存文件划分成100MB大小的微小桶(MicroRun)并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时应该已经读入了ni个微小桶(i从1到N,N表示最终将形成的桶的个数),对此ni个微小桶进行内存归并以后写出到外存中,形成一个有序的桶(Run);当所有的微小桶都被内存归并写出到外存后,就会在外存中形成N块有序的桶,分别是桶1、桶2、…、桶N,至此分块内存排序任务就完成了。所述的外存归并任务是对外存中的N个有序的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。
本排序方法是在外存文件被划分后,将每一个微小桶都加载到内存进行内部排序。如果将有序的微小桶直接写出到外存,外存归并阶段的桶个数过多,导致外存归并的磁盘读取过程发生频繁的磁头移动而严重影响输入输出性能,因此,必须先将内存的微小桶进行归并以后,形成一个较大的桶,再写出到外存中。还通过构造等价排序键,优化快速排序算法来提高内部排序的性能;通过任务驱动、AIO和双缓冲机制等技术来充分利用系统资源。
本排序方法是以计算机多线程调度方式的。并行线程都争夺主线程分配的任务并执行,在争夺了一段时间都没有任务时,就放弃中央处理器进入睡眠状态。这种方式一方面可以及时地执行分配的任务,另一方面可以防止没有任务时浪费中央处理器资源。任务处理线程的执行逻辑如下:
1、一直尝试从任务队列上获取一个任务;
2、如果尝试100000次都没有得到可以执行的任务,就放弃中央处理器,睡眠10ms;
3、如果拿到一个任务,就开始执行此任务;
4、通知任务分配线程,任务已经完成;
5、循环执行1到4,直到排序结束为止;
一种基于任务驱动和双缓冲机制的并行排序方法,如图2所示,包括以下步骤:
步骤1:分块内存排序步骤:由主线程执行分块内存排序任务。
分块内存排序任务又可以被细化为:磁盘读任务、快速排序任务、内存归并任务和磁盘写任务,主线程生成这些任务和对这些任务的操作步骤如下:
⑴根据文件大小生成一个磁盘读任务,用于读取一个微小桶的数据到内存对应的排序缓冲区中,将此磁盘读任务添加到磁盘读线程的任务队列的队尾;
⑵再生成一个磁盘读任务,添加到磁盘读线程的任务队列的队尾;
⑶等待前一个磁盘读任务的完成;
⑷分析读入内存排序缓冲区的微小桶的数据,生成元组结构和指向元组的指针数组,产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;
⑸循环执行⑵到⑷,直到没有更多的磁盘读任务或者没有更多的内存;
⑹等待最后一个磁盘读任务的完成,然后分析最后一个微小桶的数据,再产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;
⑺等待所有的快速排序任务完成;
⑻生成一个内存归并任务,用于归并内存中所有的微小桶的数据到外存的桶中,并添加到快速排序线程组任务队列的队尾;
⑼等待内存归并任务完成;
⑽重复执行⑴到⑼,直到没有更多的数据。
其中:
磁盘读任务的任务属性包括:文件句柄、输入输出起始位置在数据文件中的偏移字节数、输入输出数据大小字节数、内存微小桶缓冲区指针和信号量。
磁盘读任务的功能是:驱动读线程开始工作。
磁盘读任务的执行步骤为:在指定的文件中,从指定的位置开始读取指定大小的数据块,存入指定的微小桶缓冲区中,输入输出完成以后给主线程发送磁盘读任务已经完成信号。主线程接收到信号以后,分析此微小桶的数据,生成元组结构和指向元组的指针数组;主线程再根据分析得到的元组指针数组,构造快速排序任务。微小桶数据、分析得到的元组结构和元组指针数组如下图3所示。
快速排序任务的任务属性包括:元组指针数组(由主线程分析微小桶的数据得到)、元组个数和信号量。
快速排序任务的功能是:驱动快速排序线程组开始工作,快速排序任务只需要对元组指针数组进行快速排序,不需要移动数据。如果在磁盘读写是瓶颈的机器上,读取100MB数据的时间远远超过对此排序的时间,只需要一个快速排序线程就可以完成快速排序任务;但如果在磁盘读写性能较好的机器上,读取100MB的数据只需要几百毫秒,这时候对100MB数据的排序时间可能就会超过输入输出时间,所以快速排序需多个线程完成,还需要提高快速排序的性能。
本发明为了提高快速排序的性能,对快速排序做了如下两点改进:
(1)构造等价排序键,降低比较的成本:
比较两个字符串大小的时,只能从前往后挨个字节比较,直到出现不相等的字节为止,如果排序键字符串较长,排序的时间全部消耗在字符串比较函数中。为了提高字符串排序的性能,本发明将要排序的字符串构造成等价的排序键,排序过程中按照等价排序键比较,等价排序键一次会比较8个字节,提高了快速排序的性能。
(2)多个排序键合并构造等价排序键,降低比较的成本:
数据库中经常存在根据多个属性排序的情况,比如建立组合索引。普通的排序算法会先调用第一个属性的比较函数,如果第一个属性相等时再调用第二个属性的比较函数确定排序键的大小。这增加了一次函数调用,因快速排序过程中比较发生的非常频繁,增加一次函数调用性能就会降低很多。所以将多个排序键合并成一个等价的排序键,直接调用等价排序键的比较函数确定大小,提高了快速排序的性能。
如图4所示,等价排序键的构造方为:将字符串等属性构造成能用8字节整数进行比较的排序键的过程,等价排序键中包含了排序键和此排序键在元组指针数组上的偏移。经过优化以后的排序快速排序算法,对gensort生成的数据进行排序和优化前的快速排序算法的性能比较,可以看到性能提高了一倍:
数据大小(MB) | 快速排序(s) | 优化等价排序键(s) |
100 | 0.843 | 0.433 |
200 | 1.967 | 1.022 |
300 | 3.380 | 1.637 |
400 | 4.436 | 2.257 |
500 | 5.387 | 3.295 |
600 | 7.399 | 3.779 |
700 | 9.261 | 4.459 |
800 | 10.560 | 5.077 |
900 | 12.355 | 5.935 |
1000 | 13.483 | 6.726 |
快速排序任务并不改变内存数据缓冲区和元组指针数组中的数据,而是修改等价排序键,最终让等价排序键有序即可,等价排序键通过行偏移来确定在元组指针数组上的位置,从而找到内存数据缓冲区中的数据。
当没有更多的数据或者更多的内存时,主线程将不再生成磁盘读任务,而是生成一个内存归并任务,用于对内存中的微小桶进行归并,写出到外存的一个桶中。
内存归并任务的任务属性包括:临时文件句柄、微小桶对象数、所有的微小桶对象(元组个数、元组指针数组)、等价排序键数组和信号量。
内存归并任务的功能是:驱动快速排序线程组。快速排序线程组同时支持处理内存排序、内存归并和外存归并任务,内存归并任务直接利用快速排序任务生成并排好序的等价排序。
如图5所示,内存归并任务的执行流程如下:
⑴在每一个微小桶中顺序地读取等价排序键,插入到最小堆/最大堆中,进行堆排序;
⑵将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑶,否则就执行步骤⑺;
⑶添加一个磁盘写任务到磁盘写线程的任务队列的末尾;
⑷等待预操作缓冲区的磁盘写任务完成;
⑸转换工作缓冲区为预操作缓冲区,预操作缓冲区为工作缓冲区;
⑹将没有写入到上一个工作缓冲区的数据写出到当前工作缓冲区中;
⑺从刚才写出的记录所在的微小桶中继续读取一条记录插入到堆中,如果此微小桶中没有更多数据,就执行⑻,否则就执行⑼;
⑻删除此微小桶,微小桶的个数减一;
⑼调整最小堆;
⑽循环执行步骤⑵到步骤⑼直到微小桶的个数减到0为止。
内存归并任务使用了两个输出缓冲区,一个被称为工作缓冲区,一个被称为预操作缓冲区。这两个缓冲区会一直在工作缓冲区和预操作缓冲区之间切换,为了方便实现,本发明利用两个节点的循环链表管理这两个输出缓冲区。使用两个输出缓冲区主要是为了归并线程不用等待输入输出完成,充分利用中央处理器和输入输出资源。
磁盘写任务的任务属性和执行流程读磁盘读任务类似,甚至可以让相同的线程执行磁盘写任务和磁盘读任务,这里不再详细说明。
步骤2、外存归并步骤:主线程执行外存归并任务。
外存归并任务主要完成对外存中的N个有序的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果。其涉及磁盘读任务、外存归并任务和磁盘写任务,除了增加了每个桶的数据读入外和给每个桶都需要增加两个缓冲区外,都和内存归并非常相似。主线程生成这些任务和对这些任务的操作步骤如下:
⑴给每一个桶都生成一个磁盘读任务,并添加到磁盘读任务队列的末尾,用于从每个桶中读取一小块有序数据到桶的工作缓冲区;
⑵等待磁盘读任务执行结束,生成给该桶的预操作缓冲区读入数据的磁盘读任务,添加到磁盘读任务队列末尾;
⑶分析读入到工作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;
⑷循环执行步骤⑵和步骤⑶,直到每个桶的工作缓冲区都读入了数据;
⑸顺序的从每一个桶中读取一条记录,插入到最小堆/最大堆中,进行堆排序;
⑹将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑺,否则就执行步骤⑾;
⑺添加一个磁盘写任务到磁盘写线程的任务队列的末尾;
⑻等待预操作缓冲区的磁盘写任务完成;
⑼交换工作缓冲区和预操作缓冲区;
⑽将上一个工作缓冲区没有写入的数据写到当前工作缓冲区中;
⑾从刚才写出的记录所在的桶的内存中继续读取一条记录插入到堆中,如果此桶的内存中没有更多数据就执行步骤⑿,否则就执行⒄;
⑿如果此桶的外存中还有数据,就生成磁盘读任务,继续读取此桶的下一块数据,否则标记此桶没有更多的数据;是否在一个桶在内存中数据少于一定数量就提前进行异步输入输出,以使磁盘输入输出和中央处理器并行;
⒀如果此桶没有更多数据,就执行⒁,否则等待此桶的预操作缓冲区磁盘读任务结束,执行步骤⒂;
⒁删除此桶,桶的个数减一;
⒂分析读入预操作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;
⒃交换此桶的预操作缓冲区和工作缓冲区;
⒄调整最小堆;
⒅循环执行步骤⑹到步骤⒄直到桶的个数减到0为止。
本发明利用任务驱动多线程工作,利用双缓冲技术在中央处理器处理任务之前都给磁盘分配了异步输入输出任务以充分的利用输入输出资源。本发明还通过构造等价排序键和优化内部排序算法,来提高内部排序的性能。为了在磁盘读写不是瓶颈的服务器上充分利用多中央处理器资源,本发明用多个线程处理排序和输入输出任务。最终实现的系统,在输入输出是瓶颈的机器上运行,排序过程中能充分利用输入输出速度,并总能将输入输出利用到100%;如果在中央处理器是瓶颈的机器上运行,可以让中央处理器一直处于计算状态不会出现等待输入输出情况,从而让已有的机器的排序性能发挥到极致。
需要强调的是,本发明所述的实施例是说明性的,而不是限定性的,因此本发明并不限于具体实施方式中所述的实施例,凡是由本领域技术人员根据本发明的技术方案得出的其他实施方式,同样属于本发明保护的范围。
Claims (4)
1.一种基于任务驱动和双缓冲机制的并行排序方法,其特征在于:包括以下步骤:
步骤1:分块内存排序步骤:将外存文件划分成一定大小的微小桶并读入内存,每读入一个微小桶就对其进行快速排序,当没有更多内存可用或者没有更多数据时,对所有微小桶进行内存归并,然后写出到外存中,形成一个有序的桶;步骤1的具体步骤为:
⑴根据文件大小生成一个磁盘读任务,用于读取一个微小桶的数据到内存对应的排序缓冲区中,将此磁盘读任务添加到磁盘读线程的任务队列的队尾;
⑵再生成一个磁盘读任务,添加到磁盘读线程的任务队列的队尾;
⑶等待前一个磁盘读任务的完成;
⑷分析读入内存排序缓冲区的微小桶的数据,生成元组结构和指向元组的指针数组,产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;
⑸循环执行⑵到⑷,直到没有更多的磁盘读任务或者没有更多的内存;
⑹等待最后一个磁盘读任务的完成,然后分析最后一个微小桶的数据,再产生一个快速排序任务,并添加到快速排序线程组任务队列的队尾;
⑺等待所有的快速排序任务完成;
⑻生成一个内存归并任务,用于归并内存中所有的微小桶的数据到外存的桶中,并添加到快速排序线程组任务队列的队尾;
⑼等待内存归并任务完成;
⑽重复执行⑴到⑼,直到没有更多的数据;
所述的快速排序任务的处理方法为:对元组指针数组进行快速排序;
所述快速排序任务采用构造等价排序键以及多个排序键合并构造等价排序键的方式进行;
所述构造等价排序键的方法是将字符串等属性构造成能用8字节整数进行比较的排序键的过程;
步骤2:外存归并步骤:对外存中的桶进行归并,并将归并结果输出到最终有序的文件中,生成有序的排序结果;所述步骤2的具体步骤为
⑴给每一个桶都生成一个磁盘读任务,并添加到磁盘读任务队列的末尾,用于从每个桶中读取一小块有序数据到桶的工作缓冲区;
⑵等待磁盘读任务执行结束,生成给该桶的预操作缓冲区读入数据的磁盘读任务,添加到磁盘读任务队列末尾;
⑶分析读入到工作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;
⑷循环执行步骤⑵和步骤⑶,直到每个桶的工作缓冲区都读入了数据;
⑸顺序的从每一个桶中读取一条记录,插入到最小堆/最大堆中,进行堆排序;
⑹将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑺,否则就执行步骤⑾;
⑺添加一个磁盘写任务到磁盘写线程的任务队列的末尾;
⑻等待预操作缓冲区的磁盘写任务完成;
⑼交换工作缓冲区和预操作缓冲区;
⑽将上一个工作缓冲区没有写入的数据写到当前工作缓冲区中;
⑾从刚才写出的记录所在的桶的内存中继续读取一条记录插入到堆中,如果此桶的内存中没有更多数据就执行步骤⑿,否则就执行⒄;
⑿如果此桶的外存中还有数据,就生成磁盘读任务,继续读取此桶的下一块数据,否则标记此桶没有更多的数据;如果一个桶的内存中数据少于一定数量就提前进行异步输入输出,以使磁盘输入输出和中央处理器并行;
⒀如果此桶没有更多数据,就执行⒁,否则等待此桶的预操作缓冲区磁盘读任务结束,执行步骤⒂;
⒁删除此桶,桶的个数减一;
⒂分析读入预操作缓冲区的有序数据,生成元组指针数组,并构造等价排序键数组;
⒃交换此桶的预操作缓冲区和工作缓冲区;
⒄调整最小堆;
⒅循环执行步骤⑹到步骤⒄直到桶的个数减到0为止。
2.根据权利要求1所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于:所述磁盘读任务的处理方法为:在指定的文件中,从指定的位置开始读取指定大小的数据块,存入指定的微小桶缓冲区中,输入输出完成以后给主线程发送磁盘读任务已经完成信号。
3.根据权利要求1所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于:所述的等价排序键包含排序键和该排序键在元组指针数组上的偏移。
4.根据权利要求1所述的基于任务驱动和双缓冲机制的并行排序方法,其特征在于:所述内存归并包括以下步骤:
⑴在每一个微小桶中顺序地读取等价排序键,插入到最小堆/最大堆中,进行堆排序;
⑵将堆顶的记录写到输出缓冲区的工作缓冲区中,如果工作缓冲区已经被写满就执行步骤⑶,否则就执行步骤⑺;
⑶添加一个磁盘写任务到磁盘写线程的任务队列的末尾;
⑷等待预操作缓冲区的磁盘写任务完成;
⑸转换工作缓冲区为预操作缓冲区,预操作缓冲区为工作缓冲区;
⑹将没有写入到上一个工作缓冲区的数据写出到当前工作缓冲区中;
⑺从刚才写出的记录所在的微小桶中继续读取一条记录插入到堆中,如果此微小桶中没有更多数据,就执行⑻,否则就执行⑼;
⑻删除此微小桶,微小桶的个数减一;
⑼调整最小堆;
⑽循环执行步骤⑵到步骤⑼直到微小桶的个数减到0为止。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210510033.1A CN102968496B (zh) | 2012-12-04 | 2012-12-04 | 基于任务驱动和双缓冲机制的并行排序方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210510033.1A CN102968496B (zh) | 2012-12-04 | 2012-12-04 | 基于任务驱动和双缓冲机制的并行排序方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102968496A CN102968496A (zh) | 2013-03-13 |
CN102968496B true CN102968496B (zh) | 2016-04-27 |
Family
ID=47798634
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210510033.1A Active CN102968496B (zh) | 2012-12-04 | 2012-12-04 | 基于任务驱动和双缓冲机制的并行排序方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102968496B (zh) |
Families Citing this family (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104123304B (zh) | 2013-04-28 | 2018-05-29 | 国际商业机器公司 | 数据驱动的并行排序系统和方法 |
CN103577559A (zh) * | 2013-10-23 | 2014-02-12 | 华为技术有限公司 | 数据排序方法和装置 |
CN103595571B (zh) * | 2013-11-20 | 2018-02-02 | 北京国双科技有限公司 | 网站访问日志的预处理方法、装置及系统 |
CN104572106A (zh) * | 2015-01-12 | 2015-04-29 | 浪潮电子信息产业股份有限公司 | 一种基于小内存处理大规模数据的并行程序开发方法 |
CN104601732B (zh) * | 2015-02-12 | 2018-01-23 | 北京金和软件股份有限公司 | 一种快速实现多路数据归并的方法 |
CN104850618B (zh) * | 2015-05-18 | 2018-06-01 | 北京京东尚科信息技术有限公司 | 一种提供有序数据的系统和方法 |
CN107729135B (zh) * | 2016-08-11 | 2021-03-16 | 创新先进技术有限公司 | 按序进行并行数据处理的方法和装置 |
CN108132757B (zh) * | 2016-12-01 | 2021-10-19 | 阿里巴巴集团控股有限公司 | 数据的存储方法、装置及电子设备 |
CN106685429B (zh) * | 2016-12-29 | 2020-07-10 | 广州华多网络科技有限公司 | 整数压缩方法及装置 |
CN108874798B (zh) * | 2017-05-09 | 2022-08-12 | 北京京东尚科信息技术有限公司 | 一种大数据排序方法和系统 |
CN107357739A (zh) * | 2017-07-21 | 2017-11-17 | 郑州云海信息技术有限公司 | 一种数据内排序的方法与装置 |
CN109426484B (zh) * | 2017-08-28 | 2021-08-31 | 华为技术有限公司 | 一种数据排序装置、方法及芯片 |
CN111562898B (zh) * | 2020-05-11 | 2023-06-09 | 上海大学 | 一种基于fpga实现的多级归并排序方法 |
CN111813370B (zh) * | 2020-07-08 | 2023-10-31 | 上海雪湖科技有限公司 | 基于fpga的多路并行归并排序系统 |
CN112631787A (zh) * | 2021-01-06 | 2021-04-09 | 薛昌熵 | 一种海量外排序方法 |
CN114237500B (zh) * | 2021-12-09 | 2024-08-09 | 北京美信时代科技有限公司 | 一种通过缓存事务提高写入效率的方法及系统 |
CN114546943B (zh) * | 2022-02-21 | 2024-06-21 | 重庆科创职业学院 | 基于多进程调用的数据库文件排序优化方法及装置 |
CN117112238B (zh) * | 2023-10-23 | 2024-01-30 | 天津南大通用数据技术股份有限公司 | 一种olap数据库排序算子中的高性能归并方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5852826A (en) * | 1996-01-26 | 1998-12-22 | Sequent Computer Systems, Inc. | Parallel merge sort method and apparatus |
CN1464451A (zh) * | 2002-06-26 | 2003-12-31 | 联想(北京)有限公司 | 一种数据记录的排序方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7454420B2 (en) * | 2004-11-08 | 2008-11-18 | Sas Institute Inc. | Data sorting method and system |
-
2012
- 2012-12-04 CN CN201210510033.1A patent/CN102968496B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5852826A (en) * | 1996-01-26 | 1998-12-22 | Sequent Computer Systems, Inc. | Parallel merge sort method and apparatus |
CN1464451A (zh) * | 2002-06-26 | 2003-12-31 | 联想(北京)有限公司 | 一种数据记录的排序方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102968496A (zh) | 2013-03-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102968496B (zh) | 基于任务驱动和双缓冲机制的并行排序方法 | |
Chi et al. | Nxgraph: An efficient graph processing system on a single machine | |
Nykiel et al. | MRShare: sharing across multiple queries in MapReduce | |
Kwon et al. | A study of skew in mapreduce applications | |
US5852826A (en) | Parallel merge sort method and apparatus | |
Yang et al. | Huge: An efficient and scalable subgraph enumeration system | |
CN104133661A (zh) | 基于列存储的多核并行哈希分区优化方法 | |
US20100293135A1 (en) | Highconcurrency query operator and method | |
CN107133342A (zh) | 一种IndexR实时数据分析库 | |
CN110309233A (zh) | 数据存储的方法、装置、服务器和存储介质 | |
CN107247624B (zh) | 一种面向Key-Value系统的协同优化方法及系统 | |
Lu et al. | TridentKV: A read-optimized LSM-tree based KV store via adaptive indexing and space-efficient partitioning | |
Kyrola et al. | GraphChi-DB: Simple design for a scalable graph database system--on just a PC | |
Wang et al. | Scalable data cube analysis over big data | |
Chai et al. | Adaptive lower-level driven compaction to optimize LSM-tree key-value stores | |
CN103995827A (zh) | MapReduce计算框架中的高性能排序方法 | |
Carniel et al. | A generic and efficient framework for flash-aware spatial indexing | |
Akram | Exploiting intel optane persistent memory for full text search | |
Wang et al. | PA-tree: Polled-mode asynchronous B+ tree for NVMe | |
CN102207964A (zh) | 实时海量数据索引建立方法及系统 | |
Athanassoulis et al. | Online updates on data warehouses via judicious use of solid-state storage | |
JP6764175B2 (ja) | データベース管理システム、及び、データベース管理方法 | |
Mazur et al. | Towards scalable one-pass analytics using mapreduce | |
Ma et al. | Tidal-tree-mem: Toward read-intensive key-value stores with tidal structure based on LSM-tree | |
Li et al. | DigestJoin: Exploiting fast random reads for flash-based joins |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |