并行合并的制作方法

文档序号:11530761阅读:279来源:国知局
并行合并的制造方法与工艺

本公开内容涉及数据排序,并且更具体而言,涉及适于多线程和多节点环境的改进的高性能并行数据排序。



背景技术:

对数据排序是具有在各种学术领域和工业领域中的实际应用的经典优化问题。计算机应用可能需要高性能的排序方法来进行业务智能分析、提供演示渲染、对来自用户和应用的外部请求做出响应、以及用于其它任务。例如,可以为了根据用户或应用所定义的标准排序的记录列表而查询数据库。由于回应这些查询的整体处理时间直接受排序执行时间的影响,所以需要高性能排序以及时提供结果。排序性能对于针对大数据集工作的应用(诸如用于大型企业或高性能计算(hpc)的数据库管理系统(dbms))尤其重要,因为大量数据记录可能会放大任何排序操作的执行时间。

可以利用多线程处理为这些数据密集型应用提供合适的响应时间,其中根据数据处理工作负荷添加诸如处理器核心和/或处理节点之类的资源。通过高度可并行化的工作负荷,多线程处理具有以成本高效和实用的方式提供优化的性能缩放的潜力。由于排序可能会贡献数据处理工作负荷的大部分,所以排序成为并行化的主要目标,以减少查询延迟时间以及提高多线程环境中的数据处理吞吐量。

诸如快速排序(quicksort)的串行排序技术是容易获得的,从而为具有低至中等数据处理需求的应用提供足够的性能。然而,这些串行排序方法不太适用于具有高数据处理需求的多线程应用。虽然已经提议了用于并行化串行排序方法的各种做法,但是当尝试在数据密集型应用中处理需要排序的大量元素(其数量可以是数十亿或更多)时,或者当尝试在高度多线程的环境中将工作负荷分布到大量并行处理线程(其数量可以是数百个或更多)时,这些做法可能崩溃。

此外,要分析的给定数据集可以包括任何种类的数据分布,因此排序必须能够处理数据集而不管数据集的特定数据分布是怎样的。为了应付非均匀的数据分布而需要冗长的预处理或后处理步骤的任何并行化做法都可能由于减少或否定从并行化获得的性能增益而强加不可接受的性能损失。例如,虽然由于每个分区可以被独立排序而使得基数排序(radix-sort)可以适于(amenableto)并行化,但是根据最高有效位对数据进行分区为非均匀的数据分布或偏斜(skewed)的数据分布提供了差的工作负荷均衡。因此,对于基数排序而言,需要在计算上昂贵的预处理步骤以应付非均匀的数据分布,例如通过进行串行数据扫描来确定均衡的工作负荷分区。虽然并行数据扫描也是可能的,但是由于解决写入争用(writecontention)所需的进程间通信,并行数据扫描将强加显著的处理开销,这随着线程数量的增加只会变差。在任一情况下,由于预处理步骤而产生的性能损失可能超出由于并行化基数排序而产生的任何性能增益。

基于前述,存在对于提供适于多线程和多节点环境的高性能并行数据排序的方法的需求。

本节中描述的做法是可以推行的做法,但不一定是先前已经设想或推行的做法。因此,除非另有指示,否则不应当假设本节中描述的任何做法仅仅因为它们包含在本节中就成为现有技术。

附图说明

在附图中以示例而非限制的方式示出了本发明,附图中相同的参考标号指代相似的要素,并且其中:

图1是绘出根据实施例的用于改进的并行数据排序的示例系统的框图;

图2a是绘出根据实施例的用于改进的并行数据排序的过程的框图;

图2b是绘出根据实施例的用于接收k个有序列表的过程的框图,其中这k个有序列表优选地各自包括大约m个元素;

图2c是绘出根据实施例的用于从图2b的k个有序列表中确定n个均衡的工作负荷的过程的框图;

图2d、图2e和图2f是绘出根据实施例的用于通过迭代地调整k个有序列表的索引拆分(indexsplit)来使特定工作负荷朝均衡的目标大小范围收敛的过程的框图;

图2g是绘出根据实施例的用于并行合并及组合图2c的n个均衡的工作负荷的过程的框图;

图3是在其上可以实现实施例的计算机系统的框图。

具体实施方式

在以下描述中,出于解释的目的,阐述了许多具体细节,以便提供对本发明的透彻理解。然而,将清楚的是,本发明可以在没有这些具体细节的情况下进行实践。在其它情况下,以框图的形式示出众所周知的结构和设备,以避免不必要地模糊本发明。

总体概述

在实施例中,提供了用于高性能并行数据排序的改进的方法。在第一阶段中,要排序的多个无序数据元素被划分为k个无序列表,这k个无序列表优选地各自具有大约m个元素。这k个无序列表中的每一个可以使用任何合适的算法(诸如快速排序)来并行地独立排序,以生成k个有序列表。

在第二阶段中,从接收自第一阶段的k个有序列表中确定n个均衡的工作负荷。这n个均衡的工作负荷中的每一个由来自k个有序列表的特定的值范围界定,从而允许这n个均衡的工作负荷中的每一个被完全并行地排序并在最终的组合步骤处被快速级联。为了确定用于特定工作负荷的特定的值范围或索引拆分,候选索引拆分被选择和细化(refine)最多达最大迭代次数,使得特定工作负荷的大小朝均衡的工作负荷大小(或者说,k个有序列表的1/n)收敛。以这种方式,可以在不扫描实际数据的情况下快速确定n个均衡的工作负荷。一旦确定了n个均衡的工作负荷,它们就可以例如通过使用k路合并排序被并行地独立排序。然后这些经排序的工作负荷可以被组合,以提供最终的经排序的结果。

这种改进的高性能并行数据排序方法提供了若干技术优点,以在高度多线程和多核心的环境中实现更高的性能。首先,由于在每个阶段处的并行排序独立地进行,所以不需要进程间通信,从而大大简化了实现并消除了昂贵的开销。第二,由于确定了n个均衡的工作负荷,因此,不管要排序的元素的特定数据分布是怎样的,用于n个线程的负荷均衡都得以优化。第三,因为n个均衡的工作负荷的索引拆分是通过朝均衡的大小迭代收敛而确定的,所以不需要昂贵的数据扫描步骤。相应地,这种改进的高性能并行数据排序方法对于需要在具有许多(数量为数百个或更多)并行处理单元的硬件上处理大数据集(数量为数十亿个元素或更多)的应用具有特别的相关性。

数据库系统

本发明的实施例在dbms的上下文中使用。因此,对dbms的描述是有用的。

dbms管理数据库。dbms可以包括一个或多个数据库服务器。数据库包括存储在持久存储器机制(诸如一组硬盘)上的数据库数据和数据库字典。数据库数据可以存储在一个或多个数据容器中。每个容器包含记录。每个记录内的数据被组织成一个或多个字段。在关系dbms中,数据容器被称为表,记录被称为行,并且字段被称为列。在面向对象的数据库中,数据容器被称为对象类,记录被称为对象(在本文也称为对象记录),并且字段被称为属性。其它数据库体系架构可能使用其它术语。

用户通过向数据库服务器提交使数据库服务器对存储在数据库中的数据执行操作的命令来与dbms的数据库服务器交互。用户可以是在与数据库服务器交互的客户端计算机上运行的一个或多个应用。在本文中多个用户也可以统称为用户。

数据库命令可以是符合数据库语言的数据库语句的形式。用于表达数据库命令的数据库语言是结构化查询语言(sql)。存在许多不同版本的sql,一些版本是标准的,一些是专有的,并且存在各种扩展。数据定义语言(“ddl”)命令被发布到数据库服务器以创建或配置数据库对象,诸如表、视图或复杂数据类型。sql/xml是在对象-关系数据库中操纵xml数据时使用的sql的常见扩展。

多节点数据库管理系统由共享对相同数据库的访问的互连节点构成。通常,节点经由网络互连,并且在不同程度上共享对共享存储装置的访问,例如对一组盘驱动器和存储在其上的数据库块的共享访问。多节点数据库系统中的节点可以是经由网络互连的一组计算机(例如,工作站、个人计算机)的形式。可替代地,节点可以是网格的节点,其中网格由与机架上的其它服务器刀片互连的服务器刀片形式的节点组成。

多节点数据库系统中的每个节点托管数据库服务器。诸如数据库服务器的服务器是集成的软件部件和计算资源(诸如存储器、节点和节点上用于在处理器上执行集成软件部件的进程)的分配的组合,软件和计算资源的组合专用于代表一个或多个客户端执行特定的功能。

来自多节点数据库系统中的多个节点的资源可以被分配以运行特定的数据库服务器的软件。来自节点的资源的分配和软件的每个组合是在本文中被称为“服务器实例”或“实例”的服务器。数据库服务器可以包括多个数据库实例,其中一些或全部在单独的计算机(包括单独的服务器刀片)上运行。

改进的并行排序系统概述

图1是绘出根据实施例的用于改进的并行数据排序的示例系统的框图。图1的系统100包括客户端110、服务器节点120、数据库170以及网络180。客户端110包括应用112。服务器节点120包括处理器130和存储器140。处理器130包括处理核心132a、处理核心132b、处理核心132c和处理核心132d。处理核心132a包括线程134a,处理核心132b包括线程134b,处理核心132c包括线程134c,并且处理核心132d包括线程134d。存储器140包括服务142。服务142包括排序模块150、未排序的数据元素160、无序列表161、有序列表162、均衡的工作负荷164、经排序的工作负荷166以及经排序的结果168。排序模块150包括拆分151、并行排序152、拆分点收敛154、平行合并156和组合158。

为了支持具有大量记录和事务的数据密集型应用,服务器节点120利用多核心体系架构并发执行多个线程,由此减少延迟时间并增加数据处理吞吐量。虽然在图1中仅示出了单个处理器130和四个处理核心132a-132d,但是实施例可以包括任意数量的处理器和处理核心(数量为数百个或更多)。处理核心132a-132d可以是能够并发执行相应线程134a-134d的独立的物理核心或逻辑核心。此外,虽然在图1中仅示出了单个服务器节点120和单个客户端110,但是实施例可以包括多个服务器节点和/或多个客户端。另外,虽然系统100在联网的客户端-服务器体系架构的上下文中示出,但是系统100可以根据具体的应用需求来灵活地配置。例如,在片上系统或嵌入式应用的上下文中,客户端110和服务器节点120可以组合到单个单片设备(monolithicdevice)中。

在实施例中,系统100可以在数据库的上下文中使用。然而,系统100不一定限于数据库上下文,并且服务142可以对应于需要数据被排序的任何应用或服务。在数据库的上下文中,服务器节点120可以对应于数据库服务器,并且服务142对应于用于数据库170的dbms,从而使得诸如应用112的客户端应用能够与数据库170进行交互。相应地,应用112可以经由网络180向服务142发送数据库查询,其中数据库查询请求根据某个标准排序的记录。在实施例中,这个数据库查询可以对应于包括orderby子句(clause)的sqlselect查询。

当服务142接收来自应用112的数据库查询时,服务142可以从数据库170中检索所请求的select查询的数据库记录,然后这些数据库记录作为未排序的记录或未排序的数据元素160的列表存储在存储器140中。未排序的数据元素160可以包含大量元素(例如数十亿或更多)。为了简单起见,可以假设存储器140足够大而可以避免交换(swap)到盘的任何i/o开销。

服务142可以利用排序模块150以根据数据库查询中的标准(或者说,orderby子句)对未排序的数据元素160进行排序,以生成经排序的结果168。如排序模块150中所示,实施各个处理步骤,以将未排序的数据元素160转换成经排序的结果168,如下面结合图2a所描述的那样。注意到虽然排序模块150的每个处理步骤可能看起来是在存储器140中创建新的数据元素,但是实施例可以在适当时创建或修改诸如指针、链表或其它数据结构的结构,以避免昂贵的存储器复制操作。

为了加速排序模块150,并行排序152和并行合并156并发地利用多个线程(或者说,图1中的线程134a-134d)。这些线程中的每一个对存储器140中的数据的独立部分操作,从而绕过了并发问题(诸如写入争用以及由于进程间通信而产生的开销)。在具有多个节点的实施例中,排序模块150可以经由网络180将并行处理步骤和关联的数据分发到远程节点(图1中未示出)上的线程。远程节点可以对应于与服务器节点120类似的多核心服务器节点。一旦经排序的结果168可用,它就可以经由网络180返回到应用112,以对原始数据库查询进行响应。

改进的并行排序过程

在系统100的基本概要现在到位的情况下,审查由排序模块150实施的处理步骤的高级概述可以是有益的。转向图2a,图2a是绘出根据实施例的用于改进的并行数据排序的过程的框图。

接收k个有序列表

在过程200的方框202处,参考图1,服务器节点120接收k个有序列表(或者说,有序列表162),其中m表示每个有序列表162中的元素数量。换句话说,有序列表162应当优选地在大小上是均衡的,其中k个有序列表中的每一个包括大约m个元素。然而,在一些实施例中,有序列表162中的一个或多个列表可以包括在某种程度上偏离m的数量的元素。

方框202可以对应于过程200的第一阶段。在一些实施例中,有序列表162可以由除服务142之外的程序或服务提供。例如,来自不同服务器节点的程序可以经由网络180与有序列表162一起发送外部排序请求。在另一个实施例中,服务器节点120可以响应于来自服务142的对未排序的数据元素160进行排序的请求来创建有序列表162。在这种情况下,有序列表162的接收将来自于变换未排序的数据元素160,如图1和图2b中所示。

参考图2b,图2b是绘出根据实施例的用于接收k个有序列表的过程的框图,其中k个有序列表中优选地各自包括大约m个元素。图2b的过程222包括拆分151、并行排序152、未排序的数据元素160、无序列表161以及有序列表162。过程222可以对应于图2a的方框202。关于图2b,编号的要素可以对应于来自图1的相同编号的要素。

如图2b中所示,过程222可以通过接收未排序的数据元素160开始。例如,参考图1,服务142可以利用从数据库170中检索的记录来填充(populate)未排序的数据元素160,以回应来自应用112的sqlselect查询。然后,排序模块150可以接收来自服务142的接收未排序的数据元素160以及根据sqlselect查询中的groupby子句对未排序的数据元素160进行排序的请求。

为了说明的目的,未排序的数据元素160填充有具有正态分布的t=64个整数元素,该正态分布的平均值为40并且标准差为20。因此,未排序的数据元素160具有非均匀的分布。然而,未排序的数据元素160可以对应于具有任何数据分布(包括均匀的分布、非均匀的分布和高度偏斜的分布)的任何数量t的元素(诸如数十亿或更多元素)。此外,为了简单起见,未排序的数据元素160中的元素是以上升数值次序排列的整数。然而,实施例可以包括作为要根据一个或多个排序键排序的记录的元素,其中每个排序键可以是上升次序或下降次序。

过程222可以利用拆分151将未排序的数据元素160近似均匀地划分成无序列表161。参考图1和图2b,由于在服务器节点120处存在4个可用的线程(或者说,线程134a-134d),所以拆分151被配置有k=4。因此,无序列表161包括4个列表,这4个列表各自具有m=t/k=64/4=16个元素。当t不能被k整除时,无序列表161中的每个列表可以包括大约m个元素。此外,在一些实施例中,拆分151可以被配置为仅在特定的拆分边界处(诸如在包含多个元素的固定大小的块之间)拆分,而不是以单个元素的粒度(granularity)进行拆分。在这种情况下,无序列表161可以包括具有偏离m的数量的元素的列表。

如图2b中所示,无序列表161中的列表1-4中的每一个直接对应于未排序的数据元素160的连续的片段。相应地,拆分151可以通过基于未排序的数据元素160中元素数量(t)、在服务器节点120处可用的线程的数量(k)以及任何拆分边界(如果适用的话)将未排序的数据元素160直接划分为连续的片段来避免任何在计算上昂贵的数据分析步骤。

在现在无序列表161可用的情况下,过程222可以继续并行排序152的步骤以并行地对无序列表161中的每一个进行排序。例如,参考图1,线程134a-134c中的每一个可以并行地对无序列表161中的相应列表1-4进行排序。在并行排序152中可以使用任何排序方法,诸如快速排序。由于无序列表161中的列表各自粗略地为大约m个元素的相同大小,所以线程134a-134d应当在时间上紧密地完成,以最小化由于等待特定线程完成而造成的任何阻塞。在并行排序152完成之后,可以接收如图2b中所示那样填充的有序列表162。当然,由于有序列表162仅仅关于每个单独的列表进行排序,所以需要进一步的处理来生成最终的经排序的结果168。因此,过程200可以从方框202的第一阶段移动到以方框204开始的第二阶段。

定义目标大小范围

在过程200的方框204处,参考图1,服务器节点120为n个均衡的工作负荷164定义目标大小范围,该目标大小范围背离目标大小km/n不超出预定阈值。由于有4个线程(或者说,线程134a-134d)可用,所以n被设置为4。注意到在这个示例中k=n,因为并行排序152和并行合并156这二者都在相同的4个线程134a-134d上执行。因此,目标大小为km/n=4(16)/4=16。

然而,k不一定需要等于n。如果在并行排序152和并行合并156之间所利用的线程数量不同,则k可以不匹配n。例如,一个或多个线程134a-134d在并行排序152期间可能已经不可用,但是在并行合并156期间被置为可用,从而导致k<n。例如,如果一个或多个处理核心132a-132d在并行排序152期间是繁忙的(例如由于执行来自从不同或更高优先级的过程的线程)就会发生这种情况。在从外部源接收有序列表162的实施例中,k也可以与n不同,因为外部源可能已经使用不同数量的线程来创建了有序列表162。不管怎样,并行排序152和并行合并156这二者都作为完全并行的步骤操作,从而分别利用k个线程和n个线程,k和n可以是相同的数字或者可以不是相同的数字。

由于均衡的工作负荷164是使用拆分点收敛154(或者说,将工作负荷大小朝均衡的大小迭代收敛的过程)来确定的,所以定义目标大小范围对于减少处理时间是有用的。更具体而言,如果在最大可允许的迭代次数之前工作负荷大小在目标大小范围内,则拆分点收敛154可以提前完成。因此,可以将预定阈值设置得更大,以减少拆分点收敛154的执行时间,或者可以将预定阈值设置得更小,以减小均衡的工作负荷164中的大小变化(variance)。预定阈值可以手动设置或自动设置。例如,预定阈值可以通过使用诸如m/n的50%(或者说,0.50(16/4)=2)的比率来设置。基于这个预定阈值,目标大小范围包括背离目标大小16不超出2的大小(或者说,[14,18]),该范围包括大小14至18(含)。

确定均衡的工作负荷

在过程200的方框206处,参考图1,服务器节点120将n个均衡的工作负荷164确定为包括来自k个有序列表162中的每一个的、由特定索引范围界定的子集,其中该确定调整用于每个所述子集的特定索引范围最多达最大迭代次数,以使每个所述n个均衡的工作负荷164的大小朝在方框204中定义的目标大小范围收敛。在图1中,方框206对应于拆分点收敛154。

参考图2c,图2c是绘出根据实施例用于从图2b的k个有序列表中确定n个均衡的工作负荷的过程的框图。图2c的过程226包括收敛参数153、拆分点收敛154、有序列表162以及均衡的工作负荷164。均衡的工作负荷164包括工作负荷165a、工作负荷165b、工作负荷165c和工作负荷165d。过程226可以对应于图2a的方框206。关于图2c,编号的要素可以对应于来自图1的相同编号的要素。

收敛参数153指定由拆分点收敛154使用的参数。如关于结合方框204的示例所讨论的,预定threshold(阈值)值可以被设置为2。另外,如上面所讨论的,拆分点收敛154可以迭代最大迭代次数maxiterations=3。类似于threshold值,maxiterations值可以手动设置或自动设置,越大的迭代次数减少均衡的工作负荷164中的大小变化,而越小的迭代次数减少拆分点收敛154的执行时间。

在执行拆分点收敛154之后,可以看出,工作负荷165a包括16个元素,工作负荷165b包括19个元素,工作负荷165c包括15个元素,并且工作负荷165d包括14个元素。因此,工作负荷165a-165d中的每一个被均衡以包括大约m个元素(或者说,大约16个元素)。另外,如图2c中所示,工作负荷165a-165d中的每一个包括来自有序列表162的各个列表1-4的值的子集,这些子集由特定的索引范围界定,如图2c中的阴影线所指示的那样。这些索引范围的确定在下面结合图2d-图2f进一步详细描述,图2d-图2f分别描述用于朝目标大小范围[14,18]收敛工作负荷165a-165c的过程。

迭代拆分点收敛

在讨论图2d-图2f中所示的具体示例之前,可以使用以下步骤来描述针对特定工作负荷的拆分点收敛154中的每次迭代:

1.如果当前迭代是第一次迭代,则从有序列表中选择特定列表并选择具有索引m/n的元素作为候选拆分点。所选择的特定列表并不重要;为了简单起见,特定列表总是被选择为示例中的最后一个列表(或者说,列表4)。

2.如果当前迭代在第一次迭代之后,则基于当前工作负荷的当前大小(在下面的步骤4中确定)从前一个拆分点调整候选拆分点。如果当前大小小于目标大小范围,则特定列表是有序列表中具有最小拆分点的列表。如果当前大小大于目标大小范围,则特定列表是有序列表中具有最大拆分点的列表。绑定可以通过任意选择绑定列表中的一个来解决。通过使用收敛公式来设置用于特定列表的候选拆分点,其中左侧的i对应于用于候选拆分点的索引,并且右侧的i对应于在特定列表中用于前一个拆分点的索引。注意到这个收敛公式只是一个示例;收敛公式可以被调整,以增加或减小为每个收敛步骤移动的距离。

3.基于特定列表中的在候选拆分点处的值,找出用于有序列表中的其它列表的拆分点。例如,用于其它列表的拆分点可以选择为使得该拆分点之前的值不超出在候选拆分点处的候选值。在一些实施例中,拆分点之前的值可以包括等于在候选拆分点处的值的一个或多个值。这可以在数据中的大量偏斜导致大量完全相同的值时提供调整拆分点的一些灵活性。由于这些有序列表已经关于每个有序列表进行了排序,所以可以在其它列表中的每一个中快速找到拆分点,例如通过使用收敛采样算法或另一种方法以避免完全数据扫描。此外,如果当前迭代在第一次迭代之后,则最后一个拆分点可以用作起始参考点以找出当前拆分点。

4.当前工作负荷的当前大小是通过对每个有序列表的拆分点(包括候选拆分点)之前的元素数量求和而确定的。将这个当前大小与目标大小范围进行比较。如果当前大小在目标大小范围内,则收敛过程提前结束。如果当前迭代已经达到准许的最大迭代次数(或者说,maxiterations),则收敛过程也提前结束。在这种情况下,如果大量完全相同的值与拆分点中的一个或多个相邻,则可以相应地调整拆分点以尝试达到目标大小范围。如果上述都不适用并且当前迭代尚未达到maxiterations,则新的迭代从上面的步骤1开始。

5.在完成上面的步骤1-4之后,现在已知用于这些经排序的列表的单组拆分点,该组拆分点也为构成特定工作负荷的列表子集中的每一个定义特定的索引范围,该特定的索引范围从起始偏移量开始并且不超出拆分点。当确定第一个工作负荷时,用于每个有序列表的起始偏移量可以被初始化为零(0)。为了确定下一组拆分点,每个有序列表的起始偏移量可以移动到拆分点,并且可以重复如上所述的步骤1-4以确定下一个工作负荷。除了最后一个工作负荷之外,可以重复这个过程以确定所有工作负荷,最后一个工作负荷简单地对应于在确定倒数第二个工作负荷(或者说,n-1个工作负荷)之后从起始偏移量到每个有序列表的最后一个元素的所有元素工作负荷。

迭代拆分点收敛–第一个工作负荷

在已经一般性地描述了迭代拆分点收敛过程后,检查应用到具体示例数据的过程可以是有益的。转向图2d,图2d是绘出根据实施例的通过迭代地调整用于k个有序列表的索引拆分来朝目标大小范围[14,18]收敛工作负荷165a的过程的框图。第一次迭代以拆分点迭代155a开始。如上面在步骤1中所述,特定列表被选择为最后一个列表(或者说,列表4),并且索引m/n(或者说,16/4=4)作为候选拆分点。因此,候选拆分点在列表4中用管道符号或|符号指示,它恰好在拆分点迭代155a中用粗体指示的在索引4处的具有值20的元素之前。注意到这个示例使用其中第一个索引是索引0的约定;因此,索引4实际上指代第5个元素。

由于拆分点迭代155a是第一次迭代,所以跳过步骤2,并且步骤3开始。在步骤3中,为所有其它列表(或者说,列表1、列表2和列表3)找出拆分点。由于候选拆分点具有候选值为20,所以拆分点被选择为使得这些拆分点之前的值不超出20。因此,如拆分点迭代155a中所示,用于列表1的拆分点在索引2之前(18≤20),用于列表2的拆分点在索引2之前(13≤20),并且用于列表3的拆分点在索引1之前(13≤20)。这些拆分点由|或管道符号在列表1、2和3中指示,其中不超出20的最大值由粗体指示。

通过对每个有序列表的拆分点之前的元素数量求和来确定工作负荷165a的当前大小。因此,工作负荷165a的当前大小为2+2+1+4=9。将这个当前大小与目标大小范围[14,18]进行比较。由于当前大小小于目标大小范围,所以收敛过程继续到下一次迭代。

第二次迭代以拆分点迭代155b开始。以步骤2开始,由于当前大小小于目标大小范围,所以特定列表是具有最小拆分点的列表(或者说,在索引1处具有拆分点的列表3)。因此,用于列表3的候选拆分点是使用收敛公式(或者说,设置的。这将用于列表3的拆分点从索引1向前移动到索引3,索引3具有在拆分点迭代155b中用粗体指示的值33。

接下来,在步骤3中,为所有其它列表(或者说,列表1、列表2和列表4)找到拆分点。由于候选拆分点具有值33,所以拆分点被选择为使得这些拆分点之前的值不超出33。因此,如拆分点迭代155b中所示,用于列表1的拆分点在索引3之前(29≤33),用于列表2的拆分点在索引9之前(29≤33),用于列表4的拆分点在索引7之前(27≤33)。这些拆分点由|或管道符号在列表1、2和4中指示,其中不超出33的最大值用粗体指示。

通过对每个有序列表的拆分点之前的元素数量求和来确定工作负荷165a的当前大小。因此,工作负荷165a的当前大小为3+9+3+7=22。将这个当前大小与目标大小范围[14,18]进行比较。由于当前大小大于目标大小范围,所以收敛过程继续到下一次迭代。

第三次迭代以拆分点迭代155c开始。以步骤2开始,由于当前大小大于目标大小范围,所以特定列表是具有最大拆分点的列表(或者说,在索引9处具有拆分点的列表2)。因此,用于列表2的候选拆分点是使用收敛公式(或者说,设置的。这将用于列表3的拆分点从索引9向后移动到索引7,索引7具有在拆分点迭代155c中用粗体指示的值26。

接下来,在步骤3中,为所有其它列表(或者说,列表1、列表3和列表4)找出拆分点。由于候选拆分点具有值26,所以拆分点被选择为使得这些拆分点之前的值不超出26。因此,如拆分点迭代155c中所示,用于列表1的拆分点在索引2之前(18≤26),用于列表3的拆分点在索引1之前(13≤26),并且用于列表4的拆分点在索引6之前(20≤26)。这些拆分点由|或管道符号在列表1、3和4中指示,其中不超出26的最大值用粗体指示。注意到在列表2的情况下,拆分点之前的值包括等于拆分点的值(或者说,26)。

通过对每个有序列表的拆分点之前的元素数量求和来确定工作负荷165a的当前大小。因此,工作负荷165a的当前大小为2+7+1+6=16。将这个当前大小与目标大小范围[14,18]进行比较。由于当前大小在目标大小范围内,所以收敛过程结束。然而,即使当前大小在目标大小范围之外,收敛过程也将结束,这是由于已经达到最大迭代次数(maxiterations=3)。

在现在已知如拆分点迭代155c中所指示的第一组拆分点的情况下,工作负荷165a的内容可以从有序列表162中的每一个的子集定义,其中子集具有从每个列表的起始偏移量开始直到拆分点的索引范围。由于工作负荷165a是第一个工作负荷,所以对于每个列表起始偏移量为0。因此,工作负荷165a如图2c中所示那样被填充,其中列表1子集具有从0到1(含)的索引范围(2个元素),列表2子集具有从0到6(含)的索引范围(7个元素),列表3子集具有从0到0(含)的索引范围(包括1个元素),以及列表4子集具有从0到5(含)的索引范围(包括6个元素)。由于工作负荷165a是第一个工作负荷,所以不存在可能值的下限,但上限为26(或者说,在列表2的最后一个拆分点候选(或者说,索引7)处的值)。因此,工作负荷165a中可能值的范围由[-∞,26]指示。

迭代拆分点收敛–相继的工作负荷

如上面所讨论的,一旦针对特定工作负荷完成了步骤1-4,就可以实施步骤5,以继续下一个工作负荷。相应地,每个经排序的列表的起始偏移量向前移动到每个经排序的列表的拆分点。因此,列表1-4的起始偏移量分别被设置为2、7、1和6。这在图2e的拆分点迭代155d中示出,其中列表1现在开始于具有值29的索引2处,列表2现在开始于具有值26的索引7处,列表3现在开始于具有值30的索引1处,以及列表4现在开始于具有值27的索引6处。相应地,在确定下一组拆分点时,已完成的工作负荷将从考虑中被除去。

针对工作负荷165b实施如上面关于工作负荷165a所述的步骤1-4的过程,如图2e的拆分点迭代155d、拆分点迭代155e和拆分点迭代155f所示。为了简洁起见,省略对每个迭代步骤的全面讨论。在这个示例中,当前大小永远不会达到[14,18]的目标大小范围,但是该过程无论如何都会根据maxiterations在3次迭代之后结束。工作负荷165b中的可能值的范围由[26,40]指示。再次应用步骤5,以将起始偏移量向前移动到第二组拆分点,并且针对工作负荷165c重复该过程。

如图2f中所示,工作负荷165c在仅仅两次迭代(或者说,拆分点迭代155g和拆分点迭代155h)之后就被确定。工作负荷165c中的可能值的范围由[40,55]指示。由于工作负荷165c是倒数第二个工作负荷,所以工作负荷165d简单地是在拆分点迭代155h中的拆分点之后的剩余元素。工作负荷165d中的可能值的范围由[55,∞]指示,因为工作负荷165d是没有值的上限的最后一个工作负荷。相应地,已经确定均衡的工作负荷164中的所有工作负荷165a-165d,由此完成图2a的过程200中的方框206。

合并均衡的工作负荷

在过程200的方框208处,参考图1,服务器节点120并行地对n个均衡的工作负荷164中的每一个进行排序。参考图2g,图2g是绘出根据实施例的用于并行合并和组合n个均衡的工作负荷164的过程的框图。图2g包括并行合并157、组合158、工作负荷165a、工作负荷165b、工作负荷165c、工作负荷165d、经排序的工作负荷167a、经排序的工作负荷167b、经排序的工作负荷167c、经排序的工作负荷167以及经排序的结果168。关于图2g,工作负荷165a-165d可以对应于来自图2c的工作负荷165a-165d,经排序的工作负荷167a-167d可以对应于来自图1的经排序的工作负荷166,并且编号的要素可以对应于来自图1的相同编号的要素。

如图2g和图1中所示,工作负荷165a-165d通过使用相应线程134a-134d的并行合并156进行排序,以输出经排序的工作负荷167a-167d,经排序的工作负荷167a-167d可以对应于图1的经排序的工作负荷166。由于各个工作负荷165a-165d内的子集已经关于每个子集进行排序,所以,与使用并行排序152的第一阶段相比,使用并行合并156的第二阶段可以利用更快的排序算法。例如,并行合并156可以使用利用每个工作负荷中的子集的有序属性的方法,诸如通过使用k路合并排序或2路合并排序。

组合经排序的工作负荷

在过程200的方框210处,参考图1,服务器节点120组合经排序的工作负荷166,以输出经排序的结果168。参考图2c,工作负荷165a-165d中的每个相继的工作负荷包括没有任何重叠(边缘界定值除外)的相邻值范围。相应地,经排序的工作负荷167a-167d也将具有不重叠的相邻值范围的这种属性。因此,组合158可以使用对经排序的工作负荷166(或者说,经排序的工作负荷167a-167d)的简单级联来生成最终的经排序的结果168,如图2g中所示。然后,经排序的结果168可以返回到应用112,以回应原始的sqlselect查询,其中经排序的结果168是根据groupby子句及时排序的。应用112可以利用排序的结果168,以输出到显示器、创建输出文件或报告、或用于进一步的处理和分析。

因此过程200完成,其中最耗时的并行排序152的步骤以及并行合并156的步骤完全并行实施。通过为每个相应的并行处理步骤(或者说,并行排序152和并行合并156)确定大致相等的工作负荷(或者说,无序列表161和均衡的工作负荷164),可以实现所有可用线程的优化利用,而无论未排序的数据元素160的特定数据分布或偏斜是怎样的。此外,其它步骤(拆分151、拆分点收敛154以及组合158)可以快速实施而无需任何昂贵的数据扫描操作。因此,过程200可以为大多数数据密集型应用(诸如企业级数据库)所需的大量线程以及大量元素提供高效的缩放。

硬件综述

根据一个实施例,本文所描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行这些技术,或者可以包括诸如被持久地编程以执行这些技术的一个或多个专用集成电路(asic)或现场可编程门阵列(fpga)的数字电子设备,或者可以包括编程为按照固件、存储器、其它储存设备或者其组合中的程序指令执行这些技术的一个或多个通用硬件处理器。这种专用计算设备还可以将定制的硬连线逻辑、asic或fpga与定制的编程组合来实现这些技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者结合硬连线逻辑和/或程序逻辑来实现这些技术的任何其它设备。

例如,图3是示出本发明的实施例可以在其上实现的计算机系统300的框图。计算机系统300包括总线302或者用于传递信息的其它通信机制,以及与总线302耦合用于处理信息的硬件处理器304。硬件处理器304可以是例如通用微处理器。

计算机系统300还包括耦合到总线302用于存储信息和要由处理器304执行的指令的主存储器306,诸如随机存取存储器(ram)或其它动态存储设备。主存储器306还可以用于存储要由处理器304执行的指令的执行期间的临时变量或其它中间信息。当存储在处理器304可访问的存储介质中时,这种指令使计算机系统300成为被定制以执行指令中所指定的操作的专用机器。

计算机系统300还包括只读存储器(rom)308或者耦合到总线302的其它静态存储设备,以用于存储用于处理器304的静态信息和指令。诸如磁盘和光盘之类的存储设备310被提供并且耦合到总线302,以用于存储信息和指令。

计算机系统300可以经由总线302耦合到诸如阴极射线管(crt)之类的显示器312,以用于向计算机用户显示信息。输入设备314(包括字母数字和其它键)耦合到总线302,以用于向处理器304传递信息和命令选择。另一种类型的用户输入设备是游标控制316,诸如鼠标、轨迹球或者游标方向键,用于向处理器304传递方向信息和命令选择以及用于控制显示器312上的游标移动。这种输入设备通常具有在两个轴(第一个轴(例如,x)和第二个轴(例如,y))中的两个自由度,这允许设备指定平面中的位置。

计算机系统300可以使用定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑来实现本文所述的技术,这些定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑与计算机系统相组合,使计算机系统300成为专用机器或者把计算机系统300编程为专用机器。根据一个实施例,本文的技术由计算机系统300响应于处理器304执行包含在主存储器306中的一个或多个指令的一个或多个序列而执行。这种指令可以从另一存储介质(诸如存储设备310)读到主存储器306中。包含在主存储器306中的指令的序列的执行使处理器304执行本文所述的过程步骤。在替代实施例中,硬连线的电路系统可以代替软件指令使用或者与其组合使用。

本文所使用的术语“存储介质”指代存储使机器以具体方式操作的数据和/或指令的任何介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘或磁盘,诸如存储设备310。易失性介质包括动态存储器,诸如主存储器306。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带、或者任何其它磁性数据存储介质、cd-rom、任何其它光学数据存储介质、任何具有孔模式的物理介质、ram、prom、以及eprom、flash-eprom、nvram、任何其它存储器芯片或盒带。

存储介质与传输介质不同但是可以与其结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线302的线缆。传输介质还可以采取声波或光波的形式,诸如在无线电波数据通信和红外线数据通信中生成的那些。

各种形式的介质可以参与把一个或多个指令的一个或多个序列携带到处理器304以供执行。例如,指令最初可以被携带于远程计算机的磁盘或固态驱动器上。远程计算机可以把指令加载到它的动态存储器中并且利用调制解调器经电话线发送指令。计算机系统300本地的调制解调器可以接收电话线上的数据并且使用红外线发射器把数据转换成红外线信号。红外线检测器可以接收在红外线信号中携带的数据,并且适当的电路系统可以把数据放在总线302上。总线302把数据携带到主存储器306,处理器304从该主存储器306取出并执行指令。由主存储器306接收的指令可以在被处理器304执行之前或之后可选地存储在存储设备310上。

计算机系统300还包括耦合到总线302的通信接口318。通信接口318提供耦合到网络链路320的双向数据通信,其中网络链路320连接到本地网络322。例如,通信接口318可以是综合业务数字网络(isdn)卡、电缆调制解调器、卫星调制解调器、或者提供到对应类型的电话线的数据通信连接的调制解调器。作为另一个例子,通信接口318可以是提供到兼容的局域网(lan)的数据通信连接的lan卡。也可以实现无线链路。在任何此类实现中,通信接口318都发送和接收携带表示各种类型信息的数字信号流的电信号、电磁信号或者光学信号。

网络链路320通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路320可以通过本地网络322提供到主计算机324或者到由互联网服务提供商(isp)326操作的数据装备的连接。isp326继而通过现在通常称为“互联网”328的全球分组数据通信网络提供数据通信服务。本地网络322和互联网328这二者都使用携带数字数据流的电信号、电磁信号或光学信号。通过各种网络的信号以及在网络链路320上并通过通信接口318的信号是传输介质的示例形式,其中这些信号把数字数据携带到计算机系统300或者携带来自计算机系统300的数字数据。

计算机系统300可以通过(一个或多个)网络、网络链路320和通信接口318发送消息和接收数据,包括程序代码。在互联网示例中,服务器330可以通过互联网328、isp326、本地网络322和通信接口318传输所请求的用于应用程序的代码。

所接收的代码可以在其被接收时由处理器304执行,和/或存储在存储设备310或其它非易失性储存器中以用于随后执行。

在前面的说明书中,本发明的实施例已经参考众多的具体细节进行了描述,这些细节可以从一种实现到另一种实现不同。因此,关于本发明是什么以及申请人旨在让什么作为本发明的唯一且排他指示是根据本申请发布的一组权利要求,这是以这种权利要求发布的具体形式,包括任何后续的校正。本文对包含在这种权利要求中的术语明确阐述的任何定义应当支配权利要求中所使用的这种术语的含义。因此,在权利要求中未明确记载的任何限制、元素、属性、特征、优点或特性均不得以任何方式限制这种权利要求的范围。相应地,说明书和附图应当从说明性而非限制性意义上看待。

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