CN110704424A - 一种应用于数据库的排序方法、装置及相关设备 - Google Patents
一种应用于数据库的排序方法、装置及相关设备 Download PDFInfo
- Publication number
- CN110704424A CN110704424A CN201910829551.1A CN201910829551A CN110704424A CN 110704424 A CN110704424 A CN 110704424A CN 201910829551 A CN201910829551 A CN 201910829551A CN 110704424 A CN110704424 A CN 110704424A
- Authority
- CN
- China
- Prior art keywords
- key
- function
- bucket
- key column
- sorting
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供了一种应用于数据库的排序方法,所述数据库包括键key列,所述key列包括多个key,每个key对应一个或多个值value,所述方法包括:获取所述key列A={an};将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an);将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个key an对应的桶编号y,并将n个所述key an放至对应桶编号的数据块中;对每个数据块中的key进行排序,获得多个分桶序列;将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序的key列Z={zn}。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种应用于数据库的排序方法、装置及相关设备。
背景技术
随着大数据技术的不断发展,计算机需要排序处理的数据量大大增加。例如在运营商领域,运营商的处理器需要将每天的通信数据(包括手机通信数量,短信数量,ip电话数量等等)进行排序,那么需要排序的数据可以达到几十个T,大约有几十至上百亿。并且,基于用户对查询速度的要求逐渐变高,也对排序提出了更高的速度要求。例如百微秒云盘,要求数据的查询在微秒级响应。因此,高数据量如何快速排序成为了大数据技术的一个重要研究方向。
当前热门的排序算法包括快速排序、归并排序、堆排序等比较类排序算法,这些排序算法的时间复杂度为O(nlog(n)),其中,时间复杂度描述了该算法的运行时间,时间度越小,排序效率越高。除此之外,还有一些非比较类的热门排序算法,如计数排序、桶排序、基数排序等算法,这些算法能够将排序的时间复杂度降到O(N),其排序效率虽然高于比较类排序算法,但是在数据量过大、数据分布情况复杂时,仍易出现排序速度慢的问题。
发明内容
本申请提供了一种应用于数据库的排序方法、装置以及相关设备,用于解决在数据量过大、数据分布情况复杂时,排序速度慢的问题。
第一方面,本申请提供了一种应用于数据库的排序方法,所述数据库包括键key列,所述key列包括多个key,每个key对应一个或多个值value,所述方法包括:
获取所述key列A={an},其中,n为自然数;
将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an),其中,所述分桶函数用于将所述key列A中的n个key均匀划分至多个数据块中,每个数据块中的key数量均小于第一阈值,y是每个数据块对应的桶编号;
将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个key an对应的桶编号y,并将n个所述key an放至对应桶编号的数据块中;
对每个数据块中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号;
将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序的key列Z={zn}。
实施第一方面描述的方法,可以根据当前key列的数据分布情况,计算出最符合当前数据分布情况的分桶函数,使得key列中的key可以被平均划分至各个数据块(桶)中,每个数据块(桶)中的key个数几近等同,从而解决在数据量大、数据分布情况复杂时,分桶排序由于数据倾斜导致排序效率低下的问题。
在一实施方式中,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,表示key an与投影标签y1之间的函数关系,y1=f1(an);f2为第二函数,表示所述投影标签y1与桶编号y之间的对应关系,y=f2(y1)。
在一实施方式中,an的区间为(amin,amax),所述将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an)包括:设置等差数列B={bm}为所述key列A的标准key列,其中,bm的区间为(bmin,bmax),bmin≤amin,amax≤bmax,m为正整数;计算所述标准key列B中每个key bm对应的分布函数CDF值,获得所述标准key列B中每个key bm与投影标签y1之间的第一关系,其中,所述key bm的分布函数值等于投影标签y1;将所述标准key列B中的m个key bm平均划分至多个数据块内,获得每个key bm与桶编号y之间的第二关系;根据所述第一关系以及第二关系,获得所述投影标签y1与桶编号y之间的第二函数f2;计算并线性拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an);根据y=g(an)=f2[f1(an)]获得所述分桶函数y=g(an)。
实施上述实施方式,根据与key列A相同区间的标准key列B来获得第二函数f2,可以使得f2更加符合key列A的数据分布特征,相比于将固定函数作为第二函数f2,那么可能会导致分桶之后,桶内有数字的桶之间的编号差值过大,很多桶内并没有放置数字,但是仍需要从存储资源中划分很多个无用数据块(桶),造成资源的浪费的问题,
在一实施方式中,所述计算并线性拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an)包括:计算所述最小key amin对应的分布函数值cmin,所述最大key amax对应的分布函数值cmax;计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数,获得所述第一函数y1=f1(an)。
在一实施方式中,所述对每个数据块中的key进行排序,获得多个分桶序列之前,所述方法还包括:获取所述多个数据块中key数量超过第一阈值的数据块,其中,所述数据块中的key列D={dj},j为不大于n的正整数;将所述key列D输入所述计算模型,获得所述key列D第二次分桶排序所需的第二分桶函数y=g2(dj);将所述key列D中的每个key dj输入所述第二分桶函数y=g2(dj),获得每个key dj对应的桶编号y,并将j个所述key dj放至对应桶编号的数据块中;所述对每个数据块中的key进行排序,获得多个分桶序列包括:在所述多个数据块中,没有key数量超过所述第一阈值的数据块的情况下,对每个数据块中的key进行排序,获得多个分桶序列。
上述实施方式中,通过对分桶后,桶内key数量高于第一阈值的桶进行二次甚至三次分桶,可以极大程度避免了数据倾斜情况的出现,提高分桶排序的速度。并且,由于桶内数据低于第一阈值的桶不需要再进行二次分桶,因此对key列D二次分桶的任务可以与其他桶进行桶内排序的任务并列执行,从而进一步提高分桶排序的效率。
在一实施方式中,所述计算并线性拟合所述key列A={an}的分布函数,获得第一函数f1包括:计算所述key列A中每个key an对应的分布函数值cn,获得n个离散点(an,cn);将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数,其中,k为不大于n的正整数;根据所述k个线性函数,获得所述第一函数y1=f1(an),其中,所述第一函数y1是所述k个线性函数构成的分段线性函数。
在一实施方式中,所述最小key amin对应的分布函数值为cmin,所述最大key amax对应的分布函数值为cmax,所述将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数包括:计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数Y1=h1(an);将所述key列A中的每个key输入所述直线函数h1,获得每个key an对应的Y1;获取所述key an中,对应的所述分布函数值c以及所述Y1之间的差值小于第二阈值的k-1个key ak-1,获得k-1个点Qk-1(ak-1,ck-1);计算经过点O以及点Q1的直线函数h11,经过点Q1以及点Q2的直线函数h12,经过点Q2以及点Q3的直线函数h13,…,经过点Qk-1以及点P的直线函数h1k,获得所述k个线性函数。
上述实施方式中,采用直接两点连线的方式进行快速线性拟合,相比于传统的非线性拟合,可以减少大量复杂计算,极大提升CDF拟合的速度,可以更加快速的获得分桶函数,提高分桶排序的速度。
第二方面,提供了一种应用于数据库的排序装置,所述数据库包括键key列,所述key列包括多个key,每个key对应一个或多个值value,所述装置包括:
获取单元,所述获取单元用于获取所述key列A={an},其中,n为自然数;
计算单元,所述计算单元用于将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an),其中,所述分桶函数用于将所述key列A中的n个key均匀划分至多个数据块中,每个数据块中的key数量均小于第一阈值,y是每个数据块对应的桶编号;
分桶单元,所述分桶单元用于将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个key an对应的桶编号y,并将n个所述key an放至对应桶编号的数据块中;
排序单元,所述排序单元用于对每个数据块中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号;
拼接单元,所述拼接单元用于将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序的key列Z={zn}。
在一实施方式中,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,表示key an与投影标签y1之间的函数关系,y1=f1(an);f2为第二函数,表示所述投影标签y1与桶编号y之间的对应关系,y=f2(y1)。
在一实施方式中,an的区间为(amin,amax),所述计算单元用于:设置等差数列B={bm}为所述key列A的标准key列,其中,bm的区间为(bmin,bmax),其中,bmin≤amin,amax≤bmax,m为正整数;计算所述标准key列B中每个key bm对应的分布函数值,获得所述标准key列B中每个key bm与投影标签y1之间的第一关系,其中,所述key bm的分布函数值等于投影标签y1;将所述标准key列B中的m个key bm平均划分至多个数据块内,获得每个key bm与桶编号y之间的第二关系;根据所述第一关系以及第二关系,获得所述投影标签y1与桶编号y之间的第二函数f2;计算并拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an);根据y=g(an)=f2[f1(an)]获得所述分桶函数y=g(an)。
在一实施方式中,所述计算单元用于:计算所述最小key amin对应的分布函数值cmin,所述最大key amax对应的分布函数值cmax;计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数,获得第一函数y1=f1(an)。
在一实施方式中,所述获取单元还用于在所述排序单元对每个数据块中的key进行排序,获得多个分桶序列之前,获取所述多个数据块中key数量超过第一阈值的数据块,其中,所述数据块中的key列D={dj},j为不大于n的正整数;所述计算单元还用于将所述key列D输入所述计算模型,获得所述key列D第二次分桶排序所需的第二分桶函数y=g2(dj);所述分桶单元还用于将所述key列D中的每个key dj输入所述第二分桶函数y=g2(dj),获得每个keydj对应的桶编号y,并将j个所述keydj放至对应桶编号的数据块中;所述排序单元还用于在所述多个数据块中,没有key数量超过所述第一阈值的数据块的情况下,对每个数据块中的key进行排序,获得多个分桶序列。
在一实施方式中,所述计算单元用于:计算所述key列A中每个key an对应的分布函数值cn,获得n个离散点(an,cn);将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数,其中,k为不大于n的正整数;根据所述k个线性函数,获得所述第一函数y1=f1(an),其中,所述第一函数y1是所述k个线性函数构成的分段线性函数。
在一实施方式中,所述最小key amin对应的分布函数值为cmin,所述最大key amax对应的分布函数值为cmax,所述计算单元用于:计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数Y1=h1(an);将所述key列A中的每个key输入所述直线函数h1,获得每个key an对应的Y1;获取所述key an中,对应的所述分布函数值c以及所述Y1之间的差值小于第二阈值的k-1个keyak-1,获得k-1个点Qk-1(ak-1,ck-1);计算经过点O以及点Q1的直线函数h11,经过点Q1以及点Q2的直线函数h12,经过点Q2以及点Q3的直线函数h13,…,经过点Qk-1以及点P的直线函数h1k,获得k个线性函数。
第三方面,提供了一种计算机程序产品,当所述计算机程序产品被计算设备读取并执行时,实现如第一方面描述的方法。
第四方面,提供了一种计算机非瞬态存储介质,包括指令,当所述指令在计算设备上运行时,使得所述计算设备实现如第一方面描述的方法。
第五方面,提供了一种电子设备,包括处理器和存储器,所述处理器执行所述存储器中的代码实现如第一方面描述的方法。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍。
图1是一种分桶排序方法的流程示意图;
图2是本申请提供的一种排序方法的流程示意图;
图3是本申请提供的一种计算分桶函数的流程示意图;
图4是本申请提供的一种分布函数的拟合方法示意图;
图5-图6是本申请提供的基于横向划分方法获得第一函数f1的流程示意图;
图7是本申请提供的基于纵向划分方法获得分桶函数的流程示意图;
图8是标准key列B中每个key bn与CDF值(投影标签y1)之间的函数关系示意图;
图9是标准key列B中每个key bn与桶编号y之间的函数关系示意图;
图10是投影标签y1与桶编号y之间的第二函数f21的函数图像;
图11是key列A中每个key an与投影标签y1之间的第一函数f11的函数图像;
图12是key列A第一次分桶后的数据分布示意图;
图13是对2号桶进行第二次分桶后的数据分布示意图;
图14是对3号桶进行第二次分桶后的数据分布示意图;
图15是多种排序方法对四种数据进行排序后的排序时间比较图;
图16是本申请提供的一种应用于数据库的排序装置的结构示意图;
图17是本申请提供的一种电子设备的结构示意图。
具体实施方式
本申请的实施方式部分使用的术语仅用于对本申请的具体实施例进行解释,而非旨在限定本申请。
首先对本申请涉及的分布函数的相关概念进行简要说明。
分布函数(Cumulative Distribution Function,CDF),是概率统计中重要的函数,是随机变量研究的常用数学分析的方法。CDF是随机变量最重要的概率特征,CDF可以完整地描述随机变量的统计规律,并且决定随机变量的一切其他概率特征。
具体地,分布函数的定义可以如下:设X是一个随机变量,x是任意实数,函数F(x)=P{X≤x}称为X的分布函数。有时也记为X~F(x)。对于任意实数x1,x2(x1<x2),
P{x1<X≤x2}=P{X≤x2}-P{X≤x1}=F(x2)-F(x1) (1)
P{X>x1}=1-P{X≤x1}=1-F(x1) (2)
因此,若已知X的分布函数,就可以知道X落在任意区间上的概率,在这个意义上说,CDF完整地描述了随机变量X的统计规律性。若将X看成是数轴上随机点的坐标,那么分布函数F(x)在x处的函数值就代表x落在取件(-∞,x)上的概率。CDF是一个单调的、递增且有界的函数,
其次,对本本申请实施例涉及的“排序”的相关概念进行简要说明。
排序,指的是通过排序算法将一组或者多组数据按照既定模式进行重新排序,重新排序的序列遵循着一定的规律,比如由小至大排序或者由大致小排序,重新排序后的数据便于筛选和计算,从而大大提高了后续的计算处理效率,因此,排序算法是计算机程序设计中的重要基础算法之一。排序算法在很多领域都得到相当地重视,得到非常广泛的应用。比如在大数据处理领域,大量的信息都被存储在大型数据库中,为了提高搜索效率,一般都将信息按照多个键进行排序,使得数据能够被快速获取并进行相应的处理;再比如操作系统中,进程、线程调度时,也要对各个进程以及线程的优先级进行排序,内存的存储过程也需要对数据量进行排序,有序的数据量为内存的读取、插入和删除都提供了方便。应理解,上述应用场景仅用于举例说明,排序算法还可以应用在其他应用场景中,这里不再赘述。
例如,在数据库的应用场景中,数据库中的数据一般是以键值对(K,V)的方式存储,其中,K代表键(Key),V代表该键对应的值(Value),每个key对应至少一个value。比如K=小明,V=14岁。该种存储方式使得存储数据量大大减少,并且简单的通过单键查询、组合键查询以及范围键的查询即可获得业务所需的数据。举例来说,假设key列A包含4个key,即key列A={111,621,231,481},每个key对应的value可以如表1所示:
表1 Key列A中的每一个key以及对应的value
键(Key) | 值(Value) |
111 | V1 |
621 | V2 |
231 | V3 |
481 | V4 |
其中,这里的Value可以是用户真正存储的业务数据,在用户查询value时,简单的通过单key查询、组合key查询以及范围key的查询即可获得业务所需的数据。数据库的大量操作,例如关联表查询(join)、分组查询(group)、创建索引(index)之前,都需要把数据库里的数据按照key的顺序(比如由大到小或者有小到大)进行排列,比如,排列后有序的key列A可以如表2所示:
表2 排序后有序的key列A中的每一个key以及对应的value
键(Key) | 值(Value) |
111 | V1 |
231 | V3 |
481 | V4 |
621 | V2 |
需要说明的,为了使本申请能够更好的被理解,下面将统一以,对key列进行排序的应用场景为例进行解释说明。具体实现中,本申请提供的排序方法还可以应用于其他应用场景,比如前述内容中的大数据、存储等领域,本申请不再对此进行赘述。
可以理解的,对于排序算法来说,排序速度是排序算法的重要指标之一。比如,数据库创建索引之前,需要先对数据库里的数据按照key的顺序进行排序,那么排序速度越快,索引创建的速度越快。具体的,排序算法的排序速度通常用“时间复杂度”来衡量。时间复杂度的定义为:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。时间复杂度通常用大O符号表述。例如O(N)、O(N+2)等,其中,N代表问题的规模(算法处理数据量的大小)。时间复杂度为O(N)的算法,其运算消耗的时间远小于O(N+2)的算法,因此相比而言,时间复杂度为O(N)的算法更优,排序速度更快。
下面对当前主流的排序方法进行简要介绍。如下表3所示,当前主流的、速度较快的排序方法主要可以分为2类,比较类的排序以及非比较类的排序。其中,n为key列的数据量或者key的个数。
表3 当前主流的排序方法以及性能对比
(一)比较类排序
比较类排序指的是通过比较两个key间的大小来决定key间的相对次序。比较类排序可以分为快速排序、堆排序以及归并排序,由表3可知,比较类排序的平均时间复杂度均为O(nlogn)。下面对三种比较类排序的方法进行简要说明。
1.快速排序
快速排序(Quick Sort)的基本思想是:通过将key列分为独立的两部分,其中第一部分的所有数据都比第二部分小,再依次对这两部分进行分别排序以达到整个key列有序。
具体地,可以先从key列中选出一个key作为基准值,将key列分隔成独立的两个子序列,所有比基准值小的key作为第一子序列,所有比基准值大的key作为第二子序列;然后按照第一子序列、基准值、第二子序列的顺序排列后,对第一子序列和第二子序列分别进行递归排序,从而完成所述key列的快速排序。比如,key列A={2,1,13,4,25,3,50,30},首先随机选出一个key为基准值,比如key=4,那么key列A可以分为两个子序列,A1={2,1,3},A2={25,13,50,30};然后分别将两个子序列分别进行排序,获得排序好的A11={1,2,3},A21={13,25,30,50};最后将两个子序列与key=4进行合并得到排序好的key列A3={1,2,3,4,13,30,50}。
2.归并排序
归并排序(Merge-Sort)的基本思想是:将两个顺序key列合并成一个顺序key列(归并操作)以达到整个key列有序,即先依次使每个子序列有序,再通过归并使子序列段间有序。
具体地,对于长度为n的输入序列来说,进行归并排序的具体方法可以是:首先将长度为n的输入序列分成两个长度为n/2的子序列;将这两个长度为n/2的子序列分别采用归并排序获得两个排序好的子序列;将两个排序好的子序列合并成一个最终排序好的key列。比如,key列A={2,1,13,4,25,3,50,30},长度为8,首先将key列分成两个长度为4的子序列,其中,A1={2,1,13,4},A2={25,3,50,30};然后分别将两个子序列采用归并排序进行排序,获得排序好的A11={1,2,4,13},A21={3,25,30,50};最后将两个子序列合并得到排序好的key列A3={1,2,3,4,13,30,50}。
3.堆排序
堆排序(Heap sort)的基本思想是:将key列构造成一个大顶堆(一棵完全二叉树,满足任一节点对应的数据都比其孩子节点对应的数据大),此时,整个key列的最大值就是堆顶key。将堆顶key去掉后,剩下的n-1个数据重新构造成一个大顶堆,新的堆顶key就是第二大key。如此反复操作,直到堆变空后,即可得到一个有序的key列。
二、非比较类排序
非比较类排序不通过比较来决定key间的相对次序,而是通过一些辅助变量来进行排序,它们的时间复杂度与辅助变量相关,常见的非比较类排序算法有计数排序、基数排序以及桶排序,每种排序方法使用的辅助变量也不相同。下面对三种非比较类排序的方法进行简要说明。
1.计数排序
计数排序(Counting sort)的基本思想是:将key列中的每个key出现的次数,记录存储在额外开辟的数组空间中,通过对数组空间内数据的计算,确定每一个key的最终位置。需要说明的,计数排序要求输入的数据必须是有确定范围的整数,并且,计数排序的时间复杂度为O(n+k)。
具体地,计数排序的排序方法可以如下:获取key列A1的最小值min和最大值max;开辟一块新的数组空间,创建新的key列B,长度为(max-min+1),其中,key列B中的key记录的是key列A中每个key出现的次数,比如,key列A为{2,4,6,4,2,6},最大值为6,最小值为2,那么key列B的key个数为6-2+1=5,key列B为{(2,2),(3,0),(4,2),(5,0),(6,2)};按key列B中key排列的顺序以及对应的个数,依次输出key列A的key,获得排序好的key列A1,仍以上述例子为例,key列B为{(2,2),(3,0),(4,2),(5,0),(6,2)},那么排序好的key列A1可以是{2,2,4,4,6,6}。
2.基数排序
基数排序(radix sort)的基本思想是:先按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位排序结束,获得排序完成的key列。其中,基数排序的时间复杂度为O(n*k)。
举例来说,假设key列A最大位数为两位数,比如key列A={29,13,44,9,50,58},那么首先以个位数进行排序,比如从小到大进行排序,获得key列A1={50,13,44,58,29,9},然后以十位数进行排序,也是从小到大排序,其中,十位数相同的key,可以根据个位数排序的结果确定其先后位置,从而获得key列A2={9,13,29,44,50,58}完成排序。同理,也可以先以个位数进行从大到小进行排序,再根据十位数进行从大到小排序,从而获得从大到小排序的key列。
3.分桶排序(桶排序)
分桶排序(Bucket sort)的基本思想:利用函数的映射关系,将key列中的每个key划分到有限数量的数据块(桶)里,其中,每个数据块(桶)对应一个桶编号,每个数据块(桶)之间是有序的(比如桶编号从小到大排列),分别对各个桶内的key进行排序后,按桶编号的顺序依次将每个桶里排序好的key拼接起来,组成排序完成的key列。其中,分桶排序的时间复杂度为O(n+n*(logn-logi)),i为分桶数量。
下面以图1为例,对分桶排序方法的具体流程进行简要说明。
S101:获取待排序的key列A={an}。在图1实施例中,待排序key列A共包含20个key,待排序key列A={15,29,45,35,31,26,48,22,10,29,8,19,15,47,37,15,20,36,2,34}。
S102:将key列A中的每个key输入分桶函数y=g(an),获得每个key对应的桶编号,将相同桶编号的key划分到对应桶编号的数据块(桶)中。其中,y为桶编号,an为key列A中的key。
具体地,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,用于根据keyan获得所述key列A中的每个key对应的投影标签y1,即y1=f1(an);f2为第二函数,用于根据投影标签y1获得key列A中的每个key对应的桶编号y,即y=f2(y1)。也就是说,步骤S102包括:将key列A中的每个keyn输入第一函数y1=f1(n),获得每个key的投影标签y1;再将key列A中每个key的投影标签y1输入第二函数y=f2(y1),获得每个key对应的桶编号。
可以理解的,为了保证每个桶之间是有序的,因此分桶函数一般为单调函数。假设此时的分桶函数为其中,映射标签y1=f1(an)=an/5,桶编号 代表对映射标签y1向上取整。因此,根据待排序key列A中的第一个key“15”,将an=5代入第一函数y=an/5之后,得到key“15”对应的映射标签y1=15/5=3,将y1=3代入第二函数后获得桶编号为3,因此key“15”被划分至编号为3的数据块(桶)中。同理,将待排序key列A中的第二个key“29”代入第一函数后,得到key“29”对应的映射标签y1=29/5=5.8,将y1=5.8代入第二函数后获得桶编号为5,因此key“29”被划分至编号为5的数据块(桶)中。以此类推,可以将待排序key列A中的每个key都放入对应编号的数据块(桶)中。应理解,上述举例仅用于说明,本申请不作具体限定。
S103:对每个数据块(桶)中的key进行排序,获得多个排序好的分桶序列,其中,每个分桶序列对应一个桶编号。
如图1所示,通过分桶函数,将待排序key列A中的20个key均划分至相应桶编号的数据块(桶)中后,对每个数据块(桶)内的数据进行快速排序(快速排序方法针对少量数据排序速度是最快的,当然也可以使用其他排序方法,本申请不作具体限定)。因此,1号桶中的key为{2,8},快速排序后获得分桶序列{2,8},3号桶中的key为{15,19,15},快速排序后获得分桶序列{15,15,19};4号桶中的key为{22,20},快速排序后获得分桶序列{20,22};5号桶中的key为{29,26},快速排序后获得分桶序列{26,29};6号桶中的key为{31,34},快速排序后获得分桶序列{31,34};7号桶中的key为{35,37,36},快速排序后获得分桶序列{35,36,37};9号桶中的key为{45,48,47},快速排序后获得分桶序列{45,47,48}。
S104:将多个分桶序列按桶编号拼接后,获得排序完成的key列。具体可以如图1所示,将桶内key为零的空桶去掉后(0号桶和8号桶),按照桶编号依次取出每个桶中的分桶序列,从而获得最终排序好的序列{2,8,10,15,15,19,20,22,26,29,31,34,35,36,37,45,47,48}。其中,参考前述内容可知,在数据库的应用场景下,排序完成的序列可以用于建立索引,从而加快数据库的查询速度。
需要说明的,如果使用的分桶函数是单调递增函数,那么每个桶中的key应进行由小至大的排序获得分桶序列,并按照桶编号由小至大的顺序对分桶序列进行拼接,获得排序完成的递增key列;如果使用的分桶函数是单调递减函数,那么每个桶中的key应该进行由大致小的快速排序,并按桶编号由大至小的顺序进行拼接,获得排序完成的递减key列。
综上可知,比较类排序时间复杂度一般为O(nlogn),在数据量n较大时,时间复杂度大于非比较类算法,排序速度比较慢。而在非比较类排序方法中,计数排序和基数排序的方法均为串行操作,在数据量n较大时,单台处理器可能会出现无法承载数据排序任务的情况,导致排序失败,甚至导致系统崩溃。而分桶排序天然支持并行,比如,步骤S102中,每个key之间无耦合,可以同时使用分桶函数进行桶编号的映射,再比如,步骤S103中,每个桶内的key之间无耦合,也可以同时对每个桶内的数据进行快速排序。因此,桶排序非常适合大规模下的分布式排序,这一优点也使得分桶排序作为最好的排序方法,被广泛应用于大数据技术中。
但是,分桶排序也存在着缺点,使得在高数据量迸发的今天,分桶排序的排序速度也逐渐无法满足用户的需求。参考前述内容可知,桶排序的分桶函数决定了桶的个数以及桶内数据的个数。可以理解的,如果桶的数目越多,桶内数据的平均个数越少,桶排序速度越快,可并行的程度越高。因此,分桶函数是桶排序是否高效的关键。但是,当前分桶函数都是一个由用户设定的固定函数,当数据量较大时,数据分布情况往往会十分复杂,用户无法针对当前数据的分布,灵活设定分桶函数,这样使用固定函数对不同分布情况的数据进行分桶排序,可能会出现数据倾斜问题,也就是说,某个桶内出现大量数据的情况。仍以图1实施例为例,假设待排序key列A2={0.1,0.8.0.13,0.44,0.94,2.12,2.55,1.58,1.96},如果仍然使用分桶函数y=N/5,那么待排序key列A2中的每个key都将被分入0号桶,这样就失去了分桶的意义,导致分桶排序的效率变低。
为了解决上述排序效率低的问题,本申请提出了一种应用于数据库的排序方法,可以根据当前key列(key列)的数据分布情况,计算出最符合当前数据分布情况的分桶函数,使得key列中的key(key)可以被平均划分至各个数据块(桶)中,每个数据块(桶)中的key个数几近等同,从而解决在数据量大、数据分布情况复杂时,分桶排序由于数据倾斜导致排序效率低下的问题。
下面结合附图详细描述本申请实施例提供的排序方法。
图2是本申请提供的一种排序方法的流程示意图。如图2所示,其中,
S201:获取待排序的key列A={an},其中,n为自然数。
S202:将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an),其中,所述分桶函数用于将所述key列A中的n个key均匀划分至多个数据块中,每个数据块中的key数量均小于第一阈值,y是每个数据块对应的桶编号。
在本申请实施例中,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,表示keyan与投影标签y1之间的函数关系,y1=f1(an);f2为第二函数,表示所述投影标签y1与桶编号y之间的对应关系,y=f2(y1)。
S203:将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个keyan对应的桶编号y,并将n个所述key an放至对应桶编号的数据块(桶)中。
具体的,步骤S203可以包括:将key列A中的每个key an输入第一函数y1=f1(an),获得每个key的投影标签y1;将key列A中每个key的投影标签y1输入第二函数y=f2(y1),获得每个key对应的桶编号y。
S204:对每个数据块(桶)中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号。
S205:将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序key列Z={zn}。
参考前述内容可知,步骤S201与分桶排序中的步骤S101相同,步骤S203-步骤S205与分桶排序中的步骤S102-步骤S104相同,因此这里不再进行赘述,下面主要对步骤S202中,如何通过计算模型获取用于分桶排序的分桶函数y=g(an)=f2[f1(an)],进行简要说明。
在本申请实施例中,所述第一函数f1是keyan与投影标签y1之间的映射关系,可以是所述key列A的分布函数。由于key列A中的keyan是随机变量,随机变量的分布函数是离散的,因此第一函数f1可以是通过拟合所述key列A的分布函数后获得的。其中,所述key列A的分布函数具体可以是所述key列A的累积分布函数(CDF)或者概率密度函数(PDF),或者其他可以体现出所述key列A的数据分布特征的函数曲线,本申请不作具体限定。但是为了让本申请的方案能够被更好的理解,下文中出现的分布函数均为CDF。
可以理解的,参考前述内容可知,CDF的值代表keyan的值落在区间(-∞,an)上的概率,因此,不论key列A中每个keyan的值是多少,都可将key列A中的key转换为0-1的数字,并且,即使某两个keyan的差值非常大,也可以转换为差值较小的CDF值,比如,假设key列A={1,2,19,20},计算key列A中每个key的CDF值(根据第一函数f1获得每个key的投影标签)后,获得投影标签y1={0.25,0.5,0.75,1},1和2之间的差值为1,2和19之间的差值为17,转换为CDF之后,每个数字之间的差值均为0.25,此时再进行分桶,可以极大程度避免数据倾斜的问题,进而提高分桶排序的效率。
在本申请实施例中,所述第二函数f2是根据所述key列A中key的取值范围以及处理器的并行处理能力确定的。可以理解的,参考前述内容可知,CDF的值(投影标签y1)为0-1的小数,桶编号为整数,因此还需要对CDF的值(投影标签y1)进行进一步的处理,获得CDF(投影标签y1)与桶编号之间的对应关系f2。具体实现中,可以根据所述key列A中key的取值范围确定等差数列B为标准key列,根据处理器的线程的并行能力确定分桶数目i,计算所述标准key列的CDF值(投影标签y1)后,将标准key列M中的全部key均匀的分入预设的i个桶中,获得标准key列中每个key对应的桶编号y,根据每个key的CDF值(投影标签y1),确定每个CDF值(投影标签y1)与桶编号y之间的映射关系,也就是第二函数f2。
可以理解的,根据与key列A相同区间的标准key列B来获得第二函数f2,可以使得f2更加符合key列A的数据分布特征,如果将固定函数作为第二函数f2,那么可能会导致分桶之后,桶内有数字的桶之间的编号差值过大,很多桶内并没有放置数字,但是仍需要从存储资源中划分很多个无用数据块(桶)的问题,造成资源的浪费。
仍以上述例子为例,假设key列A={1,2,19,20},每个key的CDF值(投影标签)y1={0.25,0.5,0.75,1},假设f2为固定的取整函数,根据第二函数f2获得每个key的桶编号y={25,50,75,100},那么将需要分100个桶,将内存空间划分出100份数据块,而实际只用了25号、50号、75号以及100号桶,其他的1-24号桶、26-49号桶等等均为空桶,而且是必须存在的空桶,造成资源的浪费。而如果使用本申请提供的排序方法中计算模型进行第二函数的计算,根据key列A={1,2,19,20}的最大值为20,最小值为1,设置标准key列B{1,2,…,20},根据线程处理能力为5个,因此可以从存储空间中划分出5份进行分桶排序,计算出标准key列B的投影标签y1(CDF)以及桶编号y后,得到投影标签y1与桶编号y之间的映射关系(第二函数f2)可以如下表4所示:
表4 标准key列B中每个key的投影标签以及桶编号
keyn | 投影标签y<sub>1</sub> | 桶编号y | keyn | 投影标签y<sub>1</sub> | 桶编号y | keyn | 投影标签y<sub>1</sub> | 桶编号y |
1 | 0.05 | 1 | 8 | 0.4 | 2 | 15 | 0.75 | 4 |
2 | 0.1 | 1 | 9 | 0.45 | 3 | 16 | 0.8 | 4 |
3 | 0.15 | 1 | 10 | 0.5 | 3 | 17 | 0.85 | 5 |
4 | 0.2 | 1 | 11 | 0.55 | 3 | 18 | 0.9 | 5 |
5 | 0.25 | 2 | 12 | 0.6 | 3 | 19 | 0.95 | 5 |
6 | 0.3 | 2 | 13 | 0.65 | 4 | 20 | 1 | 5 |
7 | 0.35 | 2 | 14 | 0.7 | 4 |
因此,key列A={1,2,19,20},每个key的CDF值(投影标签)y1={0.25,0.5,0.75,1},根据第二函数f2可以获得key列A每个key对应的桶编号为{2,3,4,5},此时只需要分5个桶即可完成分桶排序,避免了从存储空间划分过多无用数据块的情况产生,提高分桶排序的效率。
综上可知,本申请提供的排序方法,使用计算模型计算出的分桶函数y=g(an)=f2[f1(an)]进行分桶排序,该分桶函数不仅结合了key列A的数据分布特征,还考虑到处理器的并行处理能力,使用该分桶函数进行分桶排序,可以极大程度避免产生数据倾斜,避免资源浪费,处理器线程并行能力可以得到最大化,从而使分桶排序的效率得到极大提升。
下面结合图3分别对上述步骤S202中通过计算模型获取用于分桶排序的分桶函数y=g(an)=f2[f1(an)]的详细流程进行详细说明。图3是本申请提供的排序方法中的计算模型的内部流程示意图,如图3所示,假设key列A={an},其中,n为正整数,an的区间为(amin,,amax),根据当前处理器线程的并行处理能力设定分桶数目为i个。
S2021:根据an的区间为(amin,amax)设置等差数列B={bm}为标准key列。
其中,bm的区间为为(bmin,bmax),其中,bmin≤amin,amax≤bmax,举例来说,key列A中的key最大值为88,最小值为5,那么标准key列B的最大值可以也是88,最小值也为5,或者,标准key列B的最大值为100,最小值为1,再或者,标准key列B的最大值为99,最小值为0等等,简单来讲,标准key列B的取值范围,可以根据计算复杂度进行适当的扩展,但是必须包括key列A中key的取值区间。应理解,上述举例仅用于举例说明,本申请不作具体限定。
具体实现中,标准key列B的通项公式可以是bm=b1+(m-1)d,其中,首项b1=amin,公差d可以是根据key列A的key的实际含义确定的经验值,比如key列A中的key代表的实际含义为日期、年龄、人数等等的正整数,那么公差d可以是1或2,如果key列A中的key为小数;比如key列A中的key代表的实际含义为概率、正确率、误差率等等,那么公差d可以是0.1或0.2,本申请不作具体限定。
S2022:计算所述标准key列B中每个keybm对应的分布函数值,获得所述标准key列B中每个keybm与投影标签y1之间的第一关系,其中,所述keybm的分布函数值等于投影标签y1。
S2023:将所述标准key列B中的m个keybm平均划分至多个数据块(桶)内,获得每个keybm与桶编号y之间的第二关系。
具体地,可以通过将标准key列B中全部key均匀放入i个桶,获得每个keybn的桶编号y。其中,i可以根据处理器的并行处理能力进行确定,比如,当前处理器最大可以同时处理20个桶内的数据,那么i可以为20。应理解,上述举例仅用于说明,并不能构成具体限定。
S2024:根据所述第一关系以及第二关系,获得所述投影标签y1与桶编号y之间的第二函数f2。
S2025:计算并拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an)。
可以理解的,参考前述内容中CDF的定义可知,key列A中的每个key是离散型随机变量,而离散型随机变量的CDF通常是离散的数据点,因此需要对这些离散的数据点进行拟合(Fitting),从而获得第一函数f1。
S2026:根据y=g(an)=f2[f1(an)],获得所述key列A的分桶函数。
在本申请实施例中,由图3可知,步骤S2021-步骤S2024针对标准key列B进行计算,而步骤S2025针对key列A进行计算,因此步骤S2025与步骤S2021-步骤S2024之间没有耦合性,步骤S2022和步骤S2023之间也没有耦合性,可以通过多线程或者分布式来实现并行操作,也就是说,步骤S2025可以与步骤S2021-步骤S2024同时执行,步骤S2022和步骤S2023同时执行,从而提高分桶函数的计算速度,进一步提高分桶排序的效率。显而易见的,如果处理器不支持多线程或者分布式,也可以串行执行图3所示的流程,比如依次执行步骤1-步骤S2026,或者,按照步骤S2025、步骤S2021-步骤S2024、步骤S2026的顺序进行,本申请不作具体限定。
可以理解的,由于标准key列B为等差数列,因此标准key列B的CDF为阶梯函数,易于计算所以不会消耗大量的计算资源,但是对于key列A来说,如果key列A的key个数非常多时,拟合所述key列A的CDF将消耗巨大的计算资源,拟合速度非常慢,可能会出现步骤S2021与步骤S2025同时开始执行,但是直到步骤S2021-步骤S2024全部执行完毕,步骤5仍未执行完毕的情况出现,导致分桶排序效率变低。为了提高拟合速度,本申请提出的计算模型中包括了多种获取第一函数f1的方法,下面将依次进行介绍。
(一)线性拟合
在本申请实施例中,所述第一函数f1可以是通过对key列A的分布函数进行线性拟合获得的。具体实现中,所述第一函数f1可以是通过分段且快速线性拟合的方法获得的。简单来说,可以将key列A的CDF值划分为多个区域,每一个区域采用线性拟合的方式获得每个区域的段函数,那么第一函数f1包括每个区域的段函数,且第一函数f1的定义域即为每个段函数定义域的并集,值域也为每个段函数值域的并集,从而达到快速拟合CDF值生成第一函数f1,提高分桶排序效率的目的。
在本申请实施例中,所述对每一个区域采用线性拟合的方式具体可以是对每一个区域采用两点连线的方式,快速线性拟合生成线性函数。也就是说,在key列A的CDF值划分为多个区域之后,将区域内的最大值和最小值连线生成的线性函数,作为该区域的段函数。也就是说,所述计算并拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an)包括:计算所述最小keyamin对应的分布函数值cmin,所述最大keyamax对应的分布函数值cmax;计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数,获得第一函数y1=f1(an)。可以理解的,参考前述内容可知,不论是离散型随机变量,还是连续型随机变量,其CDF均为单调递增的函数,因此在进行每段区域内的线性拟合时,本申请是实施例中提及的最大值和最小值可以是指该区域内的keyan的最大最小值,也可以是指该区域内CDF值的最大最小值,本申请不作具体限定。
下面以图4为例,对上述两点连线的方式生成线性函数的具体流程进行举例说明。如图4所示,假设key列A={an}的CDF值被划分为两个区域,即图4中的第一区域以及第二区域,假设第一区域中,keyan的最小值为a1,最大值为a4,第二区域中,keyan的最小值为a4,最大值为a7,那么对图4中key列A的CDF进行线性拟合的具体步骤可以是:通过计算经过第一区域的最大值与最小值的直线对应的函数获得段函数y11;通过计算经过第二区域的最大值与最小值的直线对应的函数获得段函数y12;根据所述段函数y11以及段函数y12获得所述第一函数f1,其中,
可以理解的,采用直接两点连线的方式进行快速线性拟合,相比于传统的非线性拟合,可以减少大量复杂计算,极大提升CDF拟合的速度。但是如果随意划分区域进行两点连线拟合,可能会造成拟合精度低的问题,因此,在本申请实施例中,可以通过横向划分方法和纵向划分方法对所述key列A的CDF值进行区域的划分。其中,横向划分方法针对key列A中的key有序或较为有序的应用场景,纵向划分方法针对key列A中key无序的应用场景。下面分别对横向和纵向划分方法进行详细说明。
在本申请实施例中,横向划分方法指的是,根据对未划分区域的CDF进行快速线性拟合(前述内容中两点连线的方式)后的第一函数获得的映射标签y1,与实际CDF值之间的差值大小,确定拟合精度差的区域,并基于此进行区域划分。也就是说,所述计算并拟合所述key列A={an}的分布函数,获得第一函数f1包括:计算所述key列A中每个keyan对应的分布函数值cn,获得n个离散点(an,cn);将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数,其中,k为不大于n的正整数;根据所述k个线性函数,获得所述第一函数y1=f1(an),其中,所述第一函数y1是所述k个线性函数构成的分段线性函数。
具体实现中,所述将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数包括:计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数Y1=h1(an);将所述key列A中的每个key输入所述直线函数h1,获得每个keyan对应的Y1;获取所述keyan中,对应的所述分布函数值c以及所述Y1之间的差值小于第二阈值的k-1个keyak-1,获得k-1个点Qk-1(ak-1,ck-1);计算经过点O以及点Q1的直线函数h11,经过点Q1以及点Q2的直线函数h12,经过点Q2以及点Q3的直线函数h13,…,经过点Qk-1以及点P的直线函数h1k,获得k个线性函数。也就是说,可以先将key列A中的keyan输入快速线性拟合后得到的第一函数f1之后,获得映射标签y1;计算每个key对应的映射标签y1与实际CDF的差值;将所述差值大于第二阈值的key对应的key区间;对该key区间对应的区域进行第二次快速线性拟合。以此类推,直至每个区域的中key的映射标签与实际CDF的差值均低于第一阈值,从而达到快速、高精度拟合所述CDF获得第一函数f1的目的。
举例来说,假设key列A={3,11,5,1,16,14,15,20,19,20},那么根据key列A中的最小key1对应的CDF值为0.1,最大key20对应的CDF值为1,因此根据(1,0.1)以及(20,1)计算获得第一函数f11以及映射标签为y11=f1(an)=0.05an+0.05。如图5所示,虚线为所述第一函数f11,离散点即为每个key对应的CDF值。每个key根据第一函数f11获得的映射标签y11具体可以如下表5所示。
表5 图5中key列A中的每一个keyan以及对应的CDF值、映射标签
keya<sub>n</sub> | CDF值 | 映射标签y<sub>11</sub> | 第一差值D1 | 映射标签y<sub>12</sub> | 第二差值D2 |
3 | 0.2 | 0.19 | -0.01 | 0.16 | -0.04 |
11 | 0.4 | 0.56 | 0.16 | 0.4 | 0 |
5 | 0.3 | 0.29 | -0.01 | 0.22 | -0.08 |
1 | 0.1 | 0.1 | 0 | 0.1 | 0 |
16 | 0.7 | 0.8 | 0.1 | 0.66 | -0.04 |
14 | 0.5 | 0.71 | 0.21 | 0.5 | 0 |
15 | 0.6 | 0.76 | 0.16 | 0.58 | -0.02 |
20 | 1 | 1 | 0 | 1 | 0 |
19 | 0.8 | 0.94 | 0.06 | 0.9 | 0.1 |
20 | 1 | 1 | 0 | 1 | 0 |
根据表5以及图5可知,通过未划分区域的快速线性拟合获得的第一函数f11确定的映射标签y11,与实际的CDF之间存在一定的误差。计算每个keyan的CDF值与映射标签y11之间的第一差值D1后,假设第二阈值为0.2,根据表5可知,只有当an=14时,第一差值D1=0.21超过了第二阈值0.2,因此可以将key列A分为两个区间[1,14]以及[14,20],根据每个区间的最大值和最小值,计算获得新的第一函数f12。具体地,可以根据(1,0.1)以及(14,0.5)获得区间[1,14]内的第一函数f12(an)=0.03an+0.07,根据(14,0.5)以及(20,1)获得区间[14,20]内的第一函数f12(an)=0.08an-0.62,最终获得的第一函数f12可以如图6中的实线所示。此时再计算每个keyan的CDF值与映射标签y12之间的第二差值D2,如表5所示,所述第二差值D2均小于所述第二阈值0.2,从而达到快速、高精度拟合所述CDF获得第一函数f1的目的。
在本申请实施例中,纵向划分区域的方法可以是如图7所示,使用快速线性拟合的方式(前述内容中两点连线的方式)获得第一函数后,基于所述第一函数获得第一分桶函数,并根据所述第一分桶函数对所述key列A进行第一次分桶,将桶内key数量超过第一阈值的桶(例如图7中的2号桶和4号桶),继续进行第二次分桶,以此类推,直至第m次分桶后,每个桶内的key数量均低于所述第一阈值,从而极大程度避免了数据倾斜情况的出现,提高分桶排序的速度。也就是说,所述对每个数据块中的key进行排序,获得多个分桶序列之前,所述方法还包括:获取所述多个数据块中key数量超过第一阈值的数据块,其中,所述数据块中的key列D={dj},j为不大于n的正整数;将所述key列D输入所述计算模型,获得所述key列D第二次分桶排序所需的第二分桶函数y=g2(dj);将所述key列D中的每个key dj输入所述第二分桶函数y=g2(dj),获得每个keydj对应的桶编号y,并将j个所述keydj放至对应桶编号的数据块中;所述对每个数据块中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号包括:在所述多个数据块中,没有key数量超过所述第一阈值的数据块的情况下,对每个数据块中的key进行排序,获得多个分桶序列。
具体实现中,如图7所示,每一次分桶都需要对待分桶的key列进行分桶函数的计算,比如,第一次分桶所使用的分桶函数y=g1(an)是根据key列A={an}获得的,第二次分桶所使用的分桶函数y=g21(dn)是根据2号桶中的key{dn}获得的,y=g22(fn)是根据4号桶中的key{fn}获得的,第三次分桶所使用的分桶函数y=g31(hn)是根据2.1号桶中的key{hn}获得的,y=g32(kn)是根据4.2号桶中的key{kn}获得的,直至每个桶内的key数量均低于所述第二阈值,再执行步骤S204-S205,即可完成分桶排序。可以理解的,根据每个桶中的key进行多次分桶,可以极大程度避免了数据倾斜情况的出现,提高分桶排序的速度。
其中,每一次分桶函数的计算过程可参考图3实施例,需要说明的,图3实施例中的步骤5在这里是快速线性拟合获得所述第一函数f1,也就是说,根据所述key列{an}的最大最小值获得第一函数f1后,执行图3实施例中的步骤S2021-S2024以及步骤S2026即可获得第一次分桶所使用的分桶函数y=g1(an),根据2号桶中的key{dn}的最大最小值获得第一函数f11后,执行图3实施例中的步骤S2021-S2024以及步骤S2026即可获得第二次分桶所使用的分桶函数y=g21(dn),依此类推,直至每个桶内的key数量均低于所述第一阈值,再执行步骤S204-S205,即,对每个桶中的key进行排序,获得多个排序好的分桶序列,并将多个分桶序列按桶编号拼接后,获得排序完成的key列。
需要说明的,如果第一阈值在非常小的情况下,将会进行多次分桶,相应地,也需要计算多个分桶函数,并且分桶过程也造成多次的数据迁移,占用一定的系统资源,因此,第一阈值的设定可以根据key列A的数据量进行设定。具体地,key据A的数据量较小的情况下,第一阈值可以设定的很低,比如第一阈值为1,所有桶中只有1个key,从而减少了在步骤S204时,分别对桶内排序所消耗的资源和时间,进而提高排序速度;而在数据量非常大的情况下,第一阈值可以设定的较高,比如第一阈值为3,所有桶内最多有3个key,由于3个key的排序过程所需的时间以及系统资源都非常少,因此仍可以达到快速排序的目的。
在本申请实施例中,参考前述内容可知,由于每次分桶后,桶内的数据不同,不存在耦合关系,因此在处理器支持并行的情况下,比如多线程处理器或者分布式系统的场景下,可以同时对桶内数据进行处理。举例来说,如图7所示,第一次分桶时的1、3、5号桶内的key数量没有超过第一阈值,只有2号以及4号桶超过了第一阈值,因此在并行计算2、4号桶内key的分桶函数的同时,1、3、5号桶内key可以进行快速排序的过程(步骤S204),同理,在并行计算2.1以及4.2号桶内key的分桶函数的同时,2.2、4.1号桶内key可以进行快速排序的过程,从而进一步提高分桶排序的效率。
具体实现中,多线程处理器可以是专有并行芯片,比如众核CPU/GPU/FPGA/ASIC芯片等等,本申请不作具体限定。可以理解的,该类芯片的并行能力较强,而本申请提供的排序方法中,参考前述内容可知,多数步骤不存在耦合性,具有较强的可并行度,结合上述并行能力非常强的专有并行芯片,可以极大地提高分桶排序的效率。
需要说明的,图7仅以在第一次分桶后,2号桶和4号桶中的key数量超过第一阈值,在第二次分桶后,2.1号桶以及4.2号桶中的key数量超过第一阈值为例,进行了举例说明,本申请不作具体限定,并且,本申请是以线程处理能力上限为并行处理5个桶内的数据为例进行了举例,具体实现中,每次分桶时,桶的个数可以根据线程处理能力进行设定,本申请不作具体限定。
综上,在使用分段、快速线性拟合的两种方法对CDF拟合获得第一函数f1的过程当中,横向划分方法只计算了一次分桶函数,纵向划分方法计算了多次分桶函数,因此基于横向划分方法的分桶排序速度快于所述纵向划分方法。但是,横向划分方法仍会出现部分桶内数据较多的情况,而纵向划分方法可以确保分桶后,每个桶内的key数量均低于第一阈值,可以完全避免数据倾斜的情况产生。因此,当数据量较少、数据结构简单或者较为有序的应用场景下,本申请可以使用横向划分方法进行第一函数f1的计算,当数据量更大、更复杂且无序的应用场景下,本申请可以使用纵向划分方法进行第一函数f1的计算,从而达到快速分桶排序的目的。
(二)机器学习的方法
在本申请实施例中,所述计算模型可以是使用样本集对浅层神经网络(OneHidden Layer Neural Network,OHLNN)进行训练得到的模型,其中,所述样本集包括key列以及对应的分桶函数。可以理解的,本申请提供的排序方法每次进行排序时,首先通过计算模型计算出key列A的分桶函数,然后根据分桶函数进行分桶排序,因此,计算模型计算分桶函数的速度需要非常快。而浅层神经网络指的是层数很少的神经网络,比如隐藏层的层数为2,因此训练速度快,可以快速得到训练好的计算模型,也可以在输入key列,快速预测得到分桶函数,还可以在反向传播过程中,根据使用预测得到的分桶函数的排序情况,对浅层神经网络的权重参数进行调整,对所述计算模型进行快速更新。
在本申请实施例中,所述计算模型可以是基于迁移学习的思想对预训练模型进行训练得到的模型。参考前述内容可知,本申请提供的排序方法中,计算模型计算分桶函数的速度越快越好,因此,在训练阶段,可以先在离线状态下使用大量的样本数据对预训练模型进行训练,得到训练好的预训练模型;在预测阶段,只需要根据输入的key列,对预训练模型的权重参数进行微调,快速预测得到分桶函数。
在本申请实施例中,为了提高计算模型计算所述分桶函数的速度,key列A如果数据量较大,也可以通过采样的方法生成采样key列后,输入计算模型计算出key列A的分桶函数,从而达到快速获得分桶函数的目的。具体实现中,采样的方法可以是随机采样、均匀采样、拒绝-接收采样、蒙特卡洛采样等等,本申请不作具体限定。
综上可知,使用本申请提供的排序方法,可以针对key列A的数据分布特征,快速地计算出相应的分桶函数,该分桶函数可以将key列A中的key平均划分至各个数据块(桶)中,每个数据块(桶)中的key个数几近等同,从而解决在数据量大、数据分布情况复杂时,分桶排序由于数据倾斜导致排序效率低下的问题。
下面以key列A={1,18,5,9,10,11,12,4,14,16,76,25,34,36,38,8,51,84,13,100}为例,对图2、图3以及图7实施例中所描述的排序方法进行举例说明。其中,key列A共20个key,最大key为100,最小key1,假设处理器最大可以并行处理20个桶内的数据,每个桶内最多放置2个数据(第一阈值为2),参考前述内容可知,使用本申请提供的排序方法的具体流程可以如下:
1、根据key列A的最大key为100,最小key为1,并且key列A中的key均为正数,设置一个等差key列B={bn}为标准key列。bn=1,2,3,…,100。
2、计算所述标准key列B中每个keybn的投影标签y1。具体地,可以通过计算所述标准key列B的分布函数CDF,获得每个keybn的CDF值,即为投影标签y1。标准key列B中每个keybn与CDF值(投影标签y1)之间的关系,具体可以如图8所示,其中,y1=0.1bn。
3、根据线程处理能力(假设处理器最大可以并行处理20个桶内的数据),获得所述标准key列B中的每个keybn的桶编号y。具体地,可以通过将标准key列B中全部key均匀放入20个桶,每个桶中有5个key,从而获得每个keybn的桶编号y。其中,标准key列B中每个keybn与桶编号y之间的关系,具体可以如图9所示。
4、根据每个keybn的投影标签y1(图8所示的函数),以及每个keybn的桶编号y(图9所示的函数),获得如图10所示的,投影标签y1与桶编号y之间的对应关系,从而获得第一次分桶过程中使用的第二函数f21。
5、计算所述key列A中最小key以及最大key的CDF值,根据所述最小值以及最大值计算获得第一次分桶过程中使用的第一函数f11。
具体地,计算key列A中最小key1的CDF值为0.05,最大key100的CDF值为1。根据最小值(1,0.05)以及最大值(100,1)计算获得第一次分桶过程中使用的第一函数f11,具体可以如图8所示,其中,f11(an)=0.01an+0.04。
需要说明的,如图11所示的20个离散点是所述key列A中20个key对应的CDF值,实际计算中,每个key的CDF值并不是必须计算的。图11只是为了显示出第一函数f11是通过快速线性拟合所述key列A中每个key的CDF值后获得的,并且,很多CDF值并没有落在所述第一函数f11上,因此还需要进行多次分桶。
6、根据第一函数f11获得所述key列A中每个keyan的投影标签y1,其中,每个keyan对应的投影标签y1可以如下表6所示。
表6 key列A中每个keyan对应的投影标签y1以及桶编号y
a<sub>n</sub> | 投影标签y<sub>1</sub> | 桶编号y | a<sub>n</sub> | 投影标签y<sub>1</sub> | 桶编号y |
1 | 0.05 | 0 | 76 | 0.8 | 15 |
18 | 0.22 | 4 | 25 | 0.29 | 5 |
5 | 0.09 | 1 | 34 | 0.38 | 7 |
9 | 0.13 | 2 | 36 | 0.4 | 7 |
10 | 0.13 | 2 | 38 | 0.42 | 8 |
11 | 0.05 | 2 | 8 | 0.12 | 2 |
12 | 0.16 | 3 | 51 | 0.55 | 10 |
4 | 0.08 | 1 | 84 | 0.88 | 17 |
14 | 0.18 | 3 | 13 | 0.17 | 3 |
16 | 0.2 | 3 | 100 | 1 | 19 |
7、根据步骤4获得的第二函数f21,即投影标签y1与桶编号y之间的对应关系(如图10所示),结合步骤6获得的第一函数f11,即投影标签y1与key an之间的对应关系(如表3所示),获得key列A1中每个key an对应的桶编号y。根据每个key对应的桶编号,将每个key划分至对应桶编号的数据块(桶)中,从而完成第一次分桶,第一次分桶结果可以如图12所示。
8、计算第一次分桶后,每个桶中的key数量,获取所述key数量超过第一阈值的桶。对桶内key超过第一阈值的桶进行第二次分桶,对桶内key不超过第一阈值的桶执行步骤20。
具体地,如图12所示,只有2号桶以及3号桶内的key数量为4个,超过了第二阈值2。因此,只有桶2、3需要进行第二次分桶,因此,接下来对桶2执行步骤9-13,对桶3执行步骤14-19,对其他桶内key数量低于所述第一阈值的桶,直接执行步骤20。
9、根据2号桶中的key列A2={8,9,10,11}设置一个标准key列B2={8,9,10,11}。
10、计算获得所述标准key列B2的CDF值(投影标签y1)以及对应的桶编号y,具体可以如表7所示,从而获得所述投影标签y1与桶编号y之间的对应关系,即第二次分桶过程中2号桶使用的第二函数f22。
表7 标准key列B2中的每个key对应的投影标签y1以及桶编号y
B<sub>2</sub>key | CDF值/y<sub>1</sub> | 桶编号y |
8 | 0.25 | 2.1 |
9 | 0.5 | 2.2 |
10 | 0.75 | 2.3 |
11 | 1 | 2.4 |
11、计算key列A2中最小key以及最大key的CDF值,根据所述最小值以及最大值计算获得第二次分桶过程中2号桶使用的第一函数f12。
具体地,计算key列A2中最小key8的CDF值为0.25,最大key11的CDF值为1。根据最小值(8,0.25)以及最大值(11,1)计算获得第一函数f12(an)=0.25an-1.75。
12、根据第一函数f21获得所述key列A2中每个keyan的投影标签y1,其中,每个keyan对应的投影标签y1可以如下表8所示。
表8 key列A2中的每个key对应的投影标签y1以及桶编号y
A<sub>2</sub>key | 投影标签y<sub>1</sub> | 桶编号y |
8 | 0.25 | 2.1 |
9 | 0.5 | 2.2 |
10 | 0.75 | 2.3 |
11 | 1 | 2.4 |
13、根据步骤10获得的第二函数f22,即投影标签y1与桶编号y之间的对应关系(如表7所示),结合步骤12获得的第一函数f12,即投影标签y1与keyan之间的对应关系(如表8所示),获得key列A2中每个keyan对应的桶编号y。根据每个key对应的桶编号,将每个key划分至对应桶编号的数据块(桶)中,从而完成对2号桶的第2次分桶,其分桶结果可以如图13所示。
14、根据3号桶中的key列A3={12,13,14,16}设置一个标准key列B3={12,13,14,15,16}。
15、计算获得所述标准key列B3的CDF值(投影标签y1)以及对应的桶编号y,具体可以如表9所示,从而获得所述投影标签y1与桶编号y之间的对应关系,即第二次分桶过程中3号桶使用的第二函数f23。
表9 标准key列B3中的每个key对应的投影标签y1以及桶编号y
key | CDF值/y<sub>1</sub> | 桶编号y |
12 | 0.2 | 3.1 |
13 | 0.4 | 3.2 |
14 | 0.6 | 3.3 |
15 | 0.8 | 3.4 |
16 | 1 | 3.5 |
16、计算key列A3中最小key以及最大key的CDF值,根据所述最小值以及最大值计算获得第二次分桶过程中3号桶使用的第一函数f13。
具体地,计算key列A3中最小key 12的CDF值为0.25,最大key16的CDF值为1。根据最小值(12,0.25)最大值(16,1)计算获得第一函数f13(an)=0.19an-2。
17、根据第一函数f13获得所述key列A3中每个key an的投影标签y1,其中,每个keyan对应的投影标签y1可以如下表10所示。
表10 key列A3中的每个key对应的投影标签y1以及桶编号y
key | 投影标签y<sub>1</sub> | 桶编号y |
12 | 0.25 | 3.1 |
13 | 0.5 | 3.2 |
14 | 0.75 | 3.3 |
16 | 1 | 3.5 |
18、根据步骤15获得的第二函数f23,即投影标签y1与桶编号y之间的对应关系(如表7所示),结合步骤17获得的第一函数f13,即投影标签y1与keyan之间的对应关系(如表8所示),获得key列A3中每个key an对应的桶编号y。根据每个key对应的桶编号,将每个key划分至对应桶编号的数据块(桶)中,从而完成对3号桶的第2次分桶,其分桶结果可以如图14所示。
19、计算第二次分桶后,每个桶中的key数量,获取所述key数量超过第一阈值的桶。对桶内key超过第一阈值的桶,实行第三次分桶,对桶内key不超过第一阈值的桶执行步骤20。可以理解的,在本申请实施例中,第二次分桶后,每个桶中的key数量均低于第一阈值,因此将不再进行第三次分桶。直接执行步骤20。
20、对每个桶中的key进行排序,获得多个排序好的分桶序列,其中,每个分桶序列对应一个桶编号。具体地,可以对桶内数据进行前述内容中的快速排序,可以理解的,快速排序方法针对少量数据排序速度是最快的,当然也可以使用其他排序方法,本申请不作具体限定。
21、将多个分桶序列按对应的桶编号拼接后,获得排序完成的key列。具体的,
具体地,按照桶编号,依次取出桶编号为0、1、2.1、2.2、2.3、…、19内的key,合并后获得排序完成的key列Zn={1,4,5,8,9,10,11,12,13,14,16,18,25,34,36,38,51,76,84,100}。
可以理解的,使用本申请提供的排序方法,可以针对key列A的数据分布特征计算出相应的分桶函数,该分桶函数可以将key列A中的key平均划分至各个数据块(桶)中,每个数据块(桶)中的key个数几近等同,从而解决在数据量大、数据分布情况复杂时,分桶排序由于数据倾斜导致排序效率低下的问题。
为了证明本申请提供的排序方法相比传统排序方法,排序效率更高,速度更快,下面将对本申请提供的排序方法与传统排序方法进行比较说明。其中,为了减少误差,对每种数据,将运行排序算法10次,取每次排序耗时的平均值作为该算法对该种数据排序所需的平均排序时间。
第一步,使用前述内容中的传统排序方法,分别对4种数据量为10万的测试数据进行排序,每种排序方法对每种测试数据进行排序所需的时间可以如图15所示。图15中,左侧Algorithm一列为排序算法名称,第二列gauss distr为各种排序算法对高斯分布的数据进行排序时所需的时间,第三列random为各种排序算法对随机数据进行排序时所需的时间,第四列95%sorted为各种排序算法对95%有序的数据进行排序时所需的时间,第五列sorted为各种排序算法对100%有序的数据进行排序时所需的时间。
第二步,由图15可知,Timsort(合并排序)算法与其他传统排序方法相比,排序性能最好,平均排序时间最低。因此,本申请提供的排序方法与Timsort算法针对更大的数据量进行了排序,并比较了两种排序算法的平均排序时间,比较结果如下表11所示。其中,第一数据为:利用Java自带的Random类随机生成的整形数据(不包含小数部分的数值型数据),因此数据分布较为均匀;第二数据为:总计1000万行的数据,每行包含两列数据,相较于第一数据,数据分布更加不均匀;第三数据为:总计2000万行的数据,每行包含16列数据,相较于第一数据和第二数据,数据分布更加不均匀。
表11 不同排序算法对不同数据类型进行排序所需的时间
由表11可知,本申请提供的排序方法,与传统排序种性能最优良的Timsort相比,每种数据的平均排序时间均缩短50%-60%,排序性能得到了极大的提升。这是因为使用本申请提供的排序方法,可以针对key列A的数据分布特征计算出相应的分桶函数,该分桶函数可以将key列A中的key平均划分至各个数据块(桶)中,每个数据块(桶)中的key个数几近等同,从而解决在数据量大、数据分布情况复杂时,分桶排序由于数据倾斜导致排序效率低下的问题,使得分桶排序的优势得到最大化,可以大大提高分桶排序的速度。
结合上文图1-图15所示的相关实施例,下面阐述本申请实施例涉及的相关装置。请参见图16,图16是本申请提供的一种应用于数据库的排序装置的结构示意图。所述数据库包括键key列,所述key列包括多个key,每个key对应一个或多个值value,如图16所示的排序装置100包括获取单元110、计算单元120、分桶单元130、排序单元140以及拼接单元150。
所述获取单元110用于获取所述key列A={an},其中,n为自然数;
所述计算单元120用于将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an),其中,所述分桶函数用于将所述key列A中的n个key均匀划分至多个数据块中,每个数据块中的key数量均小于第一阈值,y是每个数据块对应的桶编号;
所述分桶单元130用于将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个key an对应的桶编号y,并将n个所述key an放至对应桶编号的数据块中;
所述排序单元140用于对每个数据块中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号;
所述拼接单元150用于将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序的key列Z={zn}。
具体实现中,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,表示keyan与投影标签y1之间的函数关系,y1=f1(an);f2为第二函数,表示所述投影标签y1与桶编号y之间的对应关系,y=f2(y1)。
可选地,an的区间为(amin,amax),所述计算单元用于120:设置等差数列B={bm}为所述key列A的标准key列,其中,bm的区间为(bmin,bmax),其中,bmin≤amin,amax≤bmax,m为正整数;计算所述标准key列B中每个key bm对应的分布函数值,获得所述标准key列B中每个keybm与投影标签y1之间的第一关系,其中,所述key bm的分布函数值等于投影标签y1;将所述标准key列B中的m个key bm平均划分至多个数据块内,获得每个key bm与桶编号y之间的第二关系;根据所述第一关系以及第二关系,获得所述投影标签y1与桶编号y之间的第二函数f2;计算并拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an);根据y=g(an)=f2[f1(an)]获得所述分桶函数y=g(an)。
可选地,所述计算单元110用于:计算所述最小key amin对应的分布函数值cmin,所述最大key amax对应的分布函数值cmax;计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数,获得第一函数y1=f1(an)。
可选地,所述获取单元110还用于在所述排序单元对每个数据块中的key进行排序,获得多个分桶序列之前,获取所述多个数据块中key数量超过第一阈值的数据块,其中,所述数据块中的key列D={dj},j为不大于n的正整数;所述计算单元还用于将所述key列D输入所述计算模型,获得所述key列D第二次分桶排序所需的第二分桶函数y=g2(dj);所述分桶单元还用于将所述key列D中的每个key dj输入所述第二分桶函数y=g2(dj),获得每个keydj对应的桶编号y,并将j个所述keydj放至对应桶编号的数据块中;所述排序单元还用于在所述多个数据块中,没有key数量超过所述第一阈值的数据块的情况下,对每个数据块中的key进行排序,获得多个分桶序列。
可选地,所述计算单元110用于:计算所述key列A中每个key an对应的分布函数值cn,获得n个离散点(an,cn);将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数,其中,k为不大于n的正整数;根据所述k个线性函数,获得所述第一函数y1=f1(an),其中,所述第一函数y1是所述k个线性函数构成的分段线性函数。
可选地,所述最小key amin对应的分布函数值为cmin,所述最大key amax对应的分布函数值为cmax,所述计算单元用于:计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数Y1=h1(an);将所述key列A中的每个key输入所述直线函数h1,获得每个key an对应的Y1;获取所述key an中,对应的所述分布函数值c以及所述Y1之间的差值小于第二阈值的k-1个keyak-1,获得k-1个点Qk-1(ak-1,ck-1);计算经过点O以及点Q1的直线函数h11,经过点Q1以及点Q2的直线函数h12,经过点Q2以及点Q3的直线函数h13,…,经过点Qk-1以及点P的直线函数h1k,获得k个线性函数。
在实际应用中,本申请实施例的装置100可以通过专用集成电路(application-specific integrated circuit,ASIC)实现,或可编程逻辑器件(programmable logicdevice,PLD)实现,上述PLD可以是复杂程序逻辑器件(complex programmable logicaldevice,CPLD),现场可编程门阵列(field-programmable gate array,FPGA),通用阵列逻辑(generic array logic,GAL)或其任意组合。也可以通过软件实现,当由软件实现时,装置100以及装置中的各个模块的功能也都可以是软件模块。
参见图17,图17是本申请提供的一种电子设备的结构示意图,其中,所述电子设备1600具有并行处理任务的功能,具体可以是分布式系统中的一个节点,也可以是多核或众核处理器,也就是说,处理器1603中包含多个核心处理单元,可以同时处理多个线程任务。
其中,电子设备1600包括一个或多个处理器1603、通信接口1602和存储器1603。其中,处理器1601、通信接口1602和存储器1603之间可以通过总线16064连接。总线1604可以是外设部件互连标准(Peripheral Component Interconnect,简称PCI)总线或扩展工业标准结构(Extended Industry Standard Architecture,简称EISA)总线等。所述总线1604可以分为地址总线、数据总线、控制总线等。为便于表示,图17中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
处理器1601包括一个或者多个通用处理器,其中,通用处理器可以是能够处理电子指令的任何类型的设备,包括中央处理器(Central Processing Unit,CPU)、微处理器、微控制器、主处理器、控制器以及ASIC(Application Specific Integrated Circuit,专用集成电路)等等。处理器1601执行各种类型的数字存储指令,例如存储在存储器1603中的软件或者固件程序,它能使计算设备提供较宽的多种服务。
具体地,所述处理器1601包括函数计算模块以及桶内排序模块,其中,函数计算模块可以通过调用存储器1603中的程序代码以实现处理功能,包括图16中获取单元110、计算单元120以及分桶单元130所描述的功能,例如计算第一函数、计算第二函数、计算分桶函数等等;桶内排序模块可以通过调用存储器1603中的程序代码以实现处理功能,包括图16中排序单元140以及拼接单元150所描述的功能,例如对桶内key数量低于第一阈值的桶,进行桶内排序等等,函数计算模块以及桶内排序模块还可以用于执行图2、图3以及图7实施例描述的其他步骤,这里不再进行赘述。
通信接口1602可以为有线接口(例如以太网接口),用于与与其他设备或模块进行通信。
存储器1603可以包括易失性存储器(Volatile Memory),例如随机存取存储器(Random Access Memory,RAM);存储器也可以包括非易失性存储器(Non-VolatileMemory),例如只读存储器(Read-Only Memory,ROM)、快闪存储器(Flash Memory)、硬盘(Hard Disk Drive,HDD)或固态硬盘(Solid-State Drive,SSD)存储器还可以包括上述种类的存储器的组合。存储器1603可以存储有程序代码以及程序数据。比如存储计算第一函数的程序代码、计算第二函数的程序代码、计算分桶函数的程序代码、进行桶内排序的程序代码等等。
需要说明的,图16仅仅是本申请实施例的一种可能的实现方式,实际应用中,电子设备1600还可以包括更多或更少的部件,这里不作限制。关于本申请实施例中未示出或未描述的内容,可参见前述图1-图15所述实施例中的相关阐述,这里不再赘述。
本发明实施例还提供一种计算机非瞬态存储介质,所述计算机非瞬态存储介质中存储有指令,当其在处理器上运行时,图1-图15中所描述的任一方法流程得以实现。
本发明实施例还提供一种计算机程序产品,当所述计算机程序产品在处理器上运行时,图1-图15中所描述的任一方法流程得以实现。
结合本发明实施例公开内容所描述的方法或者算法的步骤可以硬件的方式来实现,也可以是由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于随机存取存储器(Random Access Memory,RAM)、闪存、只读存储器(Read Only Memory,ROM)、可擦除可编程只读存储器(Erasable Programmable ROM,EPROM)、电可擦可编程只读存储器(Electrically EPROM,EEPROM)、寄存器、硬盘、移动硬盘、只读光盘(CD-ROM)或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于ASIC中。另外,该ASIC可以位于计算设备中。当然,处理器和存储介质也可以作为分立组件存在于计算设备中。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
Claims (17)
1.一种应用于数据库的排序方法,其特征在于,所述数据库包括键key列,所述key列包括多个key,每个key对应一个或多个值value,所述方法包括:
获取所述key列A={an},其中,n为自然数;
将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an),其中,所述分桶函数用于将所述key列A中的n个key均匀划分至多个数据块中,每个数据块中的key数量均小于第一阈值,y是每个数据块对应的桶编号;
将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个key an对应的桶编号y,并将n个所述key an放至对应桶编号的数据块中;
对每个数据块中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号;
将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序的key列Z={zn}。
2.根据权利要求1所述的方法,其特征在于,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,表示key an与投影标签y1之间的函数关系,y1=f1(an);f2为第二函数,表示所述投影标签y1与桶编号y之间的对应关系,y=f2(y1)。
3.根据权利要求1或2所述的方法,其特征在于,an的区间为(amin,amax),所述将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an)包括:
设置等差数列B={bm}为所述key列A的标准key列,其中,bm的区间为(bmin,bmax),bmin≤amin,amax≤bmax,m为正整数;
计算所述标准key列B中每个key bm对应的分布函数CDF值,获得所述标准key列B中每个key bm与投影标签y1之间的第一关系,其中,所述key bm的分布函数值等于投影标签y1;
将所述标准key列B中的m个key bm平均划分至多个数据块内,获得每个key bm与桶编号y之间的第二关系;
根据所述第一关系以及第二关系,获得所述投影标签y1与桶编号y之间的第二函数f2;
计算并线性拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an);
根据y=g(an)=f2[f1(an)]获得所述分桶函数y=g(an)。
4.根据权利要求3所述的方法,其特征在于,所述计算并线性拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an)包括:
计算所述最小key amin对应的分布函数值cmin,所述最大key amax对应的分布函数值cmax;
计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数,获得所述第一函数y1=f1(an)。
5.根据权利要求4所述的方法,其特征在于,所述对每个数据块中的key进行排序,获得多个分桶序列之前,所述方法还包括:
获取所述多个数据块中key数量超过第一阈值的数据块,其中,所述数据块中的key列D={dj},j为不大于n的正整数;
将所述key列D输入所述计算模型,获得所述key列D第二次分桶排序所需的第二分桶函数y=g2(dj);
将所述key列D中的每个key dj输入所述第二分桶函数y=g2(dj),获得每个key dj对应的桶编号y,并将j个所述key dj放至对应桶编号的数据块中;
所述对每个数据块中的key进行排序,获得多个分桶序列包括:
在所述多个数据块中,没有key数量超过所述第一阈值的数据块的情况下,对每个数据块中的key进行排序,获得多个分桶序列。
6.根据权利要求3所述的方法,其特征在于,所述计算并线性拟合所述key列A={an}的分布函数,获得第一函数f1包括:
计算所述key列A中每个key an对应的分布函数值cn,获得n个离散点(an,cn);
将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数,其中,k为不大于n的正整数;
根据所述k个线性函数,获得所述第一函数y1=f1(an),其中,所述第一函数y1是所述k个线性函数构成的分段线性函数。
7.根据权利要求6所述的方法,其特征在于,所述最小key amin对应的分布函数值为cmin,所述最大key amax对应的分布函数值为cmax,所述将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数包括:
计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数Y1=h1(an);
将所述key列A中的每个key输入所述直线函数h1,获得每个key an对应的Y1;
获取所述key an中,对应的所述分布函数值c以及所述Y1之间的差值小于第二阈值的k-1个key ak-1,获得k-1个点Qk-1(ak-1,ck-1);
计算经过点O以及点Q1的直线函数h11,经过点Q1以及点Q2的直线函数h12,经过点Q2以及点Q3的直线函数h13,…,经过点Qk-1以及点P的直线函数h1k,获得所述k个线性函数。
8.一种应用于数据库的排序装置,其特征在于,所述数据库包括键key列,所述key列包括多个key,每个key对应一个或多个值value,所述装置包括:
获取单元,所述获取单元用于获取所述key列A={an},其中,n为自然数;
计算单元,所述计算单元用于将所述key列A输入计算模型,获得分桶排序所需的分桶函数y=g(an),其中,所述分桶函数用于将所述key列A中的n个key均匀划分至多个数据块中,每个数据块中的key数量均小于第一阈值,y是每个数据块对应的桶编号;
分桶单元,所述分桶单元用于将所述key列A中的每个key输入所述分桶函数y=g(an),获得每个key an对应的桶编号y,并将n个所述key an放至对应桶编号的数据块中;
排序单元,所述排序单元用于对每个数据块中的key进行排序,获得多个分桶序列,其中,一个分桶序列对应一个桶编号;
拼接单元,所述拼接单元用于将所述多个分桶序列按照桶编号的顺序进行拼接,获得有序的key列Z={zn}。
9.根据权利要求8所述的装置,其特征在于,所述分桶函数y=g(an)=f2[f1(an)],其中,f1为第一函数,表示key an与投影标签y1之间的函数关系,y1=f1(an);f2为第二函数,表示所述投影标签y1与桶编号y之间的对应关系,y=f2(y1)。
10.根据权利要求8或9所述的装置,其特征在于,an的区间为(amin,amax),所述计算单元用于:
设置等差数列B={bm}为所述key列A的标准key列,其中,bm的区间为(bmin,bmax),其中,bmin≤amin,amax≤bmax,m为正整数;
计算所述标准key列B中每个key bm对应的分布函数值,获得所述标准key列B中每个keybm与投影标签y1之间的第一关系,其中,所述key bm的分布函数值等于投影标签y1;
将所述标准key列B中的m个key bm平均划分至多个数据块内,获得每个key bm与桶编号y之间的第二关系;
根据所述第一关系以及第二关系,获得所述投影标签y1与桶编号y之间的第二函数f2;
计算并拟合所述key列A={an}的分布函数CDF,获得第一函数y1=f1(an);
根据y=g(an)=f2[f1(an)]获得所述分桶函数y=g(an)。
11.根据权利要求10所述的装置,其特征在于,所述计算单元用于:
计算所述最小key amin对应的分布函数值cmin,所述最大key amax对应的分布函数值cmax;
计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数,获得第一函数y1=f1(an)。
12.根据权利要求11所述的装置,其特征在于,
所述获取单元还用于在所述排序单元对每个数据块中的key进行排序,获得多个分桶序列之前,获取所述多个数据块中key数量超过第一阈值的数据块,其中,所述数据块中的key列D={dj},j为不大于n的正整数;
所述计算单元还用于将所述key列D输入所述计算模型,获得所述key列D第二次分桶排序所需的第二分桶函数y=g2(dj);
所述分桶单元还用于将所述key列D中的每个key dj输入所述第二分桶函数y=g2(dj),获得每个keydj对应的桶编号y,并将j个所述keydj放至对应桶编号的数据块中;
所述排序单元还用于在所述多个数据块中,没有key数量超过所述第一阈值的数据块的情况下,对每个数据块中的key进行排序,获得多个分桶序列。
13.根据权利要求12所述的装置,其特征在于,所述计算单元用于:
计算所述key列A中每个key an对应的分布函数值cn,获得n个离散点(an,cn);
将所述n个离散点划分为k个区域,分别对k个区域中的每个区域的离散点进行线性拟合,获得k个线性函数,其中,k为不大于n的正整数;
根据所述k个线性函数,获得所述第一函数y1=f1(an),其中,所述第一函数y1是所述k个线性函数构成的分段线性函数。
14.根据权利要求13所述的装置,其特征在于,所述最小key amin对应的分布函数值为cmin,所述最大key amax对应的分布函数值为cmax,所述计算单元用于:
计算经过点O(amin,cmin)以及P(amax,cmax)的直线函数Y1=h1(an);
将所述key列A中的每个key输入所述直线函数h1,获得每个key an对应的Y1;
获取所述key an中,对应的所述分布函数值c以及所述Y1之间的差值小于第二阈值的k-1个keyak-1,获得k-1个点Qk-1(ak-1,ck-1);
计算经过点O以及点Q1的直线函数h11,经过点Q1以及点Q2的直线函数h12,经过点Q2以及点Q3的直线函数h13,…,经过点Qk-1以及点P的直线函数h1k,获得k个线性函数。
15.一种计算机程序产品,其特征在于,当所述计算机程序产品被计算设备读取并执行时,如权利要求1至7任一权利要求所述的方法将被实现。
16.一种计算机非瞬态存储介质,其特征在于,包括指令,当所述指令在计算设备上运行时,使得所述计算设备实现如权利要求1至7任一权利要求所述的方法。
17.一种电子设备,其特征在于,包括处理器和存储器,所述处理器执行所述存储器中的代码实现如权利要求1至7任一权利要求所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910829551.1A CN110704424B (zh) | 2019-09-03 | 2019-09-03 | 一种应用于数据库的排序方法、装置及相关设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910829551.1A CN110704424B (zh) | 2019-09-03 | 2019-09-03 | 一种应用于数据库的排序方法、装置及相关设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110704424A true CN110704424A (zh) | 2020-01-17 |
CN110704424B CN110704424B (zh) | 2023-01-06 |
Family
ID=69193395
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910829551.1A Active CN110704424B (zh) | 2019-09-03 | 2019-09-03 | 一种应用于数据库的排序方法、装置及相关设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110704424B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112104743A (zh) * | 2020-09-21 | 2020-12-18 | 北京金山云网络技术有限公司 | 序列生成方法、装置和电子设备 |
CN113900622A (zh) * | 2021-09-22 | 2022-01-07 | 中国科学院国家空间科学中心 | 一种基于fpga的数据信息快速排序方法、系统、设备及存储介质 |
CN114817274A (zh) * | 2022-07-01 | 2022-07-29 | 长沙广立微电子有限公司 | 晶圆数据的处理方法、装置、电子装置和存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH09190336A (ja) * | 1996-01-10 | 1997-07-22 | Nec Corp | ベクトル演算装置を用いたバケットソート処理方式 |
CN108228634A (zh) * | 2016-12-15 | 2018-06-29 | 杭州华为数字技术有限公司 | 一种数据处理方法及装置 |
CN109885732A (zh) * | 2019-01-16 | 2019-06-14 | 中南大学 | 一种基于数据分布模型的分布式排序系统 |
-
2019
- 2019-09-03 CN CN201910829551.1A patent/CN110704424B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH09190336A (ja) * | 1996-01-10 | 1997-07-22 | Nec Corp | ベクトル演算装置を用いたバケットソート処理方式 |
CN108228634A (zh) * | 2016-12-15 | 2018-06-29 | 杭州华为数字技术有限公司 | 一种数据处理方法及装置 |
CN109885732A (zh) * | 2019-01-16 | 2019-06-14 | 中南大学 | 一种基于数据分布模型的分布式排序系统 |
Non-Patent Citations (1)
Title |
---|
断点: "桶排序", 《HTTP://BLOG.SINA.COM.CN/S/BLOG_667739BA0100VETH.HTML》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112104743A (zh) * | 2020-09-21 | 2020-12-18 | 北京金山云网络技术有限公司 | 序列生成方法、装置和电子设备 |
CN112104743B (zh) * | 2020-09-21 | 2022-08-16 | 北京金山云网络技术有限公司 | 序列生成方法、装置和电子设备 |
CN113900622A (zh) * | 2021-09-22 | 2022-01-07 | 中国科学院国家空间科学中心 | 一种基于fpga的数据信息快速排序方法、系统、设备及存储介质 |
CN113900622B (zh) * | 2021-09-22 | 2022-04-08 | 中国科学院国家空间科学中心 | 一种基于fpga的数据信息快速排序方法、系统、设备及存储介质 |
CN114817274A (zh) * | 2022-07-01 | 2022-07-29 | 长沙广立微电子有限公司 | 晶圆数据的处理方法、装置、电子装置和存储介质 |
CN114817274B (zh) * | 2022-07-01 | 2022-09-16 | 长沙广立微电子有限公司 | 晶圆数据的处理方法、装置、电子装置和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110704424B (zh) | 2023-01-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108701250B (zh) | 数据定点化方法和装置 | |
CN110704424B (zh) | 一种应用于数据库的排序方法、装置及相关设备 | |
US9442929B2 (en) | Determining documents that match a query | |
CN110837584B (zh) | 一种分块并行构造后缀数组的方法及系统 | |
Awad et al. | Dynamic graphs on the GPU | |
WO2022017167A1 (zh) | 一种信息处理方法、系统、电子设备及存储介质 | |
CN112994701A (zh) | 数据压缩方法、装置、电子设备及计算机可读介质 | |
CN112925821A (zh) | 基于MapReduce的并行频繁项集增量数据挖掘方法 | |
Engels et al. | Practical near neighbor search via group testing | |
CN111028897A (zh) | 一种基于Hadoop的基因组索引构建的分布式并行计算方法 | |
CN107368281B (zh) | 一种数据处理方法及装置 | |
Adan et al. | Analysis of structured Markov processes | |
CN108011735B (zh) | 社区发现方法及装置 | |
DeSalvo | Improvements to exact Boltzmann sampling using probabilistic divide-and-conquer and the recursive method | |
Chopard et al. | Problems, algorithms, and computational complexity | |
Liu et al. | Discovery of deep order-preserving submatrix in DNA microarray data based on sequential pattern mining | |
US20180365350A1 (en) | Generating circuits | |
Muthusundari et al. | A Mathematical based Divide and Conquer Approach to aNew Sorting Algorithm with Min Max Index Value | |
CN116821559B (zh) | 用于快速获取一组大数据集中趋势的方法、系统及终端 | |
Ji | Research on fast de-duplication of text backup information in library database based on big data | |
Leckey et al. | A limit theorem for radix sort and tries with Markovian input | |
CN114265701B (zh) | 资源处理方法、装置、计算机设备和存储介质 | |
US20240143276A1 (en) | Advanced digital sorting and search | |
CN111143456B (zh) | 基于Spark的Cassandra数据导入方法、装置、设备及介质 | |
Moghaddam et al. | Sorting algorithm for medium and large data sets based on multi-level independent subarrays |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20220214 Address after: 550025 Huawei cloud data center, jiaoxinggong Road, Qianzhong Avenue, Gui'an New District, Guiyang City, Guizhou Province Applicant after: Huawei Cloud Computing Technology Co.,Ltd. Address before: 518129 Bantian HUAWEI headquarters office building, Longgang District, Guangdong, Shenzhen Applicant before: HUAWEI TECHNOLOGIES Co.,Ltd. |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |