一种大数据索引的排序方法

文档序号:6537127阅读:170来源:国知局
一种大数据索引的排序方法
【专利摘要】本发明公开了一种大数据索引的排序方法,采用分治的思想按索引的关键字对索引数据进行动态地分区排序,对每个分区内的索引数据,采用类似于平衡二叉树的方法组成一棵包括多个索引项的结点构成的二叉排序树。在读入数据的同时进行排序,每读入一个索引项,就按索引项关键字值放入相应的区间进行排序,数据读入完成,排序也就完成了。读完了数据只要按分区顺序对相应的二叉排序树进行中序遍历就得到了排序结果。本发明在高配置的计算机系统上使用,充分发挥计算机的性能,更加符合大数据对算法复杂性的要求。本发明克服了传统的内排序算法不适合处理大数据的不足,采用本发明进行索引排序有效提高了算法的效率。
【专利说明】—种大数据索引的排序方法
【技术领域】
[0001]本发明属于大数据处理的【技术领域】,特别涉及一种大数据索引的排序方法。
【背景技术】
[0002]大数据来啦! Facebook分享的内容条数达10亿,数据量达到TB数量级。作为传统数据处理的基本技术,排序在大数据时代仍然是十分重要的一个基本操作,与此前不同的是大数据对包括排序算法在内的所有算法的时间复杂性要求不再满足于多项式时间复杂度,甚至像O (N* log N)这样的所谓最优的复杂度,它期望达到线性复杂度:O (N)。
[0003]现代计算机与50年前甚至10多年前的计算机相比已不可同日而语,64位机器已相当普遍,地址空间达到了 264,AMD64架构支持52位(4PB)的地址总线和48位(256TB)的虚拟地址空间。DELL机器实际配置的物理内存达96G,标配硬盘容量到了 1.5TB,三级缓存也是20年前不可想象的12M。Linux系统的虚拟内存可达实际物理内存的2倍,而内存页面大小可为4M,64位的Linux则分别支持46位(64TB)的物理地址空间和47位(128T)的进程虚拟地址空间,64位的windows7最大支持128G的内存。不同平台上64位的编译器已经很普遍,可以说现代计算机的高性能和高配置为大数据处理带来了方便。
[0004]但传统的排序算法并不适合直接移植到现代计算机上来就可以处理大数据。
[0005]经典排序算法包括插入排序、选择排序、交换排序、归并排序和分布排序等五个类型。插入排序、选择排序、交换排序、归并排序等这类比较排序都采用“比较”和“移动”两个基本操作,以顺序存储结构存放待排序数据。插入排序在数据量很小时是高效的,但其时间复杂度达到了 O (N2)。树形选择排序利用前期的工作减少了后期的工作量,其中的堆排序被认为是经典排序算法中最好的,其时间复杂度达到了 O (N*峋N),但有比较大的常数因子。交换排序中的快速排序在最坏情况下的时间复杂度达到了 O (N2),因为它是递归的,在数据量大的时候是不能容忍的。归并排序尽管时间复杂度比较理想,但其空间复杂度达到了 O (N)。分布排序包括基数排序、计数排序和桶排序等这类所谓线性时间排序,也有其局限性。基数排序采用“分配”和“收集”两个基本操作,按多关键字排序的思想,以每个关键字在其取值范围内的每个值组织一个链表来存储数据,它是针对关键字在一个较小范围内的排序算法。计数排序对关键字的取值范围有限制,即最大元素值小于元素个数,辅存空间大。桶排序是以假设关键字均匀分布为基础。位图算法的限制是排序数不能太大,数据无重复,只能是整数或映射到整数的数据。总之,这些经典的排序算法都不能充分发挥现代计算机的性能,也不适合大数据环境。
[0006]以归并为核心的外排序算法因为要多次读、写文件也不适合于大数据环境。即使是在集群上运行的PSRS这类超级快速并行排序算法,因为负载均衡的难题、通信的瓶颈和不可避免的归并等原因其加速效果也有限,原因是并行排序算法也需要合适的内排序算法作基础。在互联网的今天,我们都在说:数据堆积、知识贫乏。信息检索的重要性是不言而喻的,而索引在检索中的重要性则是众所周知,索引的排序是检索的关键操作之一。
[0007]现有的排序算法无论是内排序还是外排序抑或是并行排序一方面都没有充分发挥现代计算机的性能,另一方面也难以满足大数据处理的需要。不管将来的集群有多大,也不论“云”有多广,大数据的排序,是大数据分析中的基础工作。利用现代计算机的特点并充分地发挥它的性能,开发在单机上运行的大数据处理的排序算法有其必要性和现实性。

【发明内容】

[0008]发明目的:本发明的目的在于针对现有技术的不足,提供一种有效提高算法效率的大数据索引的排序方法。
[0009]技术方案:为了达到上述发明目的,本发明提供一种大数据索引的排序方法,包括以下步骤:
[0010]步骤1:根据索引关键字的取值范围将索引初始划分为Size/Alpha个区间,其中,Size=+为规模控制参数,Alpha为分布密度差异系数,N为索引项的总数,同时根据索引
项的取值范围和划分的区间数平均设定每个区间索引关键字值的上限;
[0011]步骤2:根据步骤I中的每个区间索引关键字值的上限创建区间表,所述区间表管理区间的动态划分,每个区间内索引项最多不超过Size个,在每个区间内建立一个用于存放区间内索引项的二叉排序树,并设定二叉排序树的索引项插入方法;这种存储方案便于区间的均衡分裂,实现区间的动态划分;
[0012]步骤3:在每个二叉排序树中的每个结点中设定一个索引项数组,并设定索引项数组中存储索引项的上限以及索引项存储的顺序,所述索引项存储的顺序按索引项关键字从小到大的顺序从左至右依次存储;这就提高了存储密度,也减小了二叉排序树的高度,对二叉排序树的调整频率远低于传统的平衡二叉树构造过程中的调整频度,有效地提高了排序的效率;
[0013]步骤4:读取索引文件的数据,根据索引项关键字的值在区间表中查询区间,将读取的索引项按照步骤2中设定的二叉排序树的索引项插入方法插入到对应区间的二叉排序树上;
[0014]步骤5:按照区间的顺序对每个区间中相应的二叉排序树进行中序遍历,同时对每个结点中的索引项数组顺序读取,并将读取的结果保存在排序文件中。
[0015]进一步,所述二叉排序树的索引项插入方法为:
[0016]步骤201:判断查询到的区间内是否已满,如果区间已满,在查询到的区间的右侧创建一个新的区间,将原区间中的二叉排序树的右子树从原二叉排序树中分裂出来并移至新的区间中,同时将原二叉排序树的树根移至其左子树的右脊梁的末端,并根据平衡要求调整二叉排序树,这就实现了区间的均衡分裂,也就是进行区间的动态划分;如果查找到的区间未满,则进行下一步操作;
[0017]步骤202:将读取的索引项的索引关键字的值与二叉排序树的树根中存储的索引关键字值进行比较,如果读取的索引项的索引关键字值比二叉排序树的树根中的索引项数组中最左端的索引关键字的值小,则将读取的索引项递归地插入到二叉排序树的左子树中;相反,如果读取的索引关键字值比二叉排序树的树根中的索引项数组中最右端的索引关键字的值大,则将读取的索引项值递归地插入到二叉排序树的右子树中;如果读取的索引关键字的值介于索引项数组中最左端的索引关键字的值和最右端的索引关键字的值之间,查看二叉排序树的树根中设置的索引项数组中存储的数据是否已满,如果未满,则按照索引项存储的顺序将读取索引项插入到索引项数组中;如果已满,则将二叉排序树的树根进行结点分裂,产生一个新结点,把索引项数组中左半边索引项留在原结点,右半边索引项存储到新结点中;如果左子树中存储的索引项数多于右子树中存储的索引项数,则将新结点移至根的右子树的左脊梁的末端,否则将原结点移至根的左子树的右脊梁的末端。其中,将索引项数组中存储的索引项从中间平均分成左右两组,其中左边的一组称为索引项数组中左半边索引项,右边一组称为索引项数组中右半边索引项。
[0018]更进一步,所述步骤201中根据平衡要求调整二叉排序树的方法为:如果二叉排序树的左子树上存储的索引项的数量大于二叉排序树的右子树存储的索引项的数量与两倍的索引项数组中存储索引项的上限之和,就将二叉排序树的左子树的右脊梁末端结点做二叉排序树的根,将原根移至其右子树的左脊梁的末端;如果二叉排序树的的右子树上存储的索引项的数量大于二叉排序树的左子树存储的索引项的数量与两倍的索引项数组中存储索引项的上限之和,就将二叉排序树的右子树的左脊梁末端结点做二叉排序树的根,将原根移至其左子树的右脊梁的末端。这就保证了二叉排序树的有序性和平衡性。
[0019]工作原理:本发明采用分治的思想按索引的关键字对索引数据进行动态地分区排序,对每个分区内的索引数据,采用类似于平衡二叉树的方法组成一棵由具有多关键字的结点构成的二叉排序树。在读入数据的同时进行排序,每读入一个索引项,就按索引项关键字值放入相应的区间进行排序,数据读入完成,排序也就完成了,一次读入即可完成排序。读完了数据只要按分区顺序对相应的二叉排序树进行中序遍历就得到了排序结果。
[0020]有益效果:与现有技术相比,本发明在高配置的计算机系统上使用,充分发挥计算机的性能,以分治的思想,结合顺序存储和链式存储的优点,更加符合大数据算法复杂性要求。本发明克服了传统的内排序算法不适合处理大量数据的不足,也不必像一般的外排序算法那样需要多次的文件读、写。采用本发明进行索引排序有效提高了算法的效率。本发明可以直接应用到大型数据库上,或者被互联网大公司直接采用,在分布式环境下也可以作为一种高效的内排序算法。
【专利附图】

【附图说明】·
[0021]图1为本发明的流程图;
[0022]图2为本发明中涉及的二叉排序树的结构示意图。
【具体实施方式】
[0023]下面对本发明技术方案进行详细说明,但是本发明的保护范围不局限于所述实施例。
[0024]如图1所示,本发明提供了一种大数据索引的排序方法,包括以下步骤:
[0025]步骤1:根据索引关键字的取值范围将索引初始划分为Size/Alpha个区间;其中,
Size为规模控制参数,Size=^N,N是索引项的总数,Alpha为索引项关键字的分布密度差
异系数,对于均匀分布Alpha取值为I,正态分布Alpha取值可以为2~10。同时根据索引项的取值范围和划分的区间数平均设定每个区间索引关键字值的上限;
[0026]步骤2:构造一个区间表来管理区间的划分及排序工作,对每个区间构造一个表项,相应每个区间有一个二叉排序树存放具体的区间内数据。这样使得区间表可以常驻内存,每棵二叉排序树即使不能常驻内存也由于其小于一个虚拟内存的页面大小而可以减少换入、换出的次数,每个区间内存储的索引项的个数的最大值为Size ;
[0027]其中,二叉排序树如图2所示,图中,A为整个二叉排序树的树根,结点B、D、E、H、I和J组成了 A的左子树,结点C、F、G、K、L和M组成了 A的右子树,结点A、B、D和H组成了二叉排序树的左脊梁,结点B、E和J组成了 A的左子树的右脊梁,结点C、F和K组成了 A的右子树的左脊梁,结点J为A的左子树的右脊梁的末端,结点K为A的右子树的左脊梁的末端。
[0028]对于每个区间的排序则原则上按照二叉排序树的思想来建构一棵二叉排序树,这样在区间分裂的时候就十分方便。无疑建构平衡的二叉排序树对于将区间平均一分为二是有益的,但鉴于传统的平衡二叉树存储密度小,在建构的过程中需要不停的对树进行局部调整,且在大数据的背景下其高度太大,本发明提供了一种新的结点结构,除了左、右子树的指针域,每个结点中包括一个存储多个索引项的索引项数组,也就是说每个结点可以存储多个索引项。
[0029]步骤3:在每个二叉排序树中的每个结点中设定一个索引项数组,并设定索引项数组中存储索引项的上限为Beta,以及索引项存储的顺序,其中,索引项存储的顺序按索引项关键字从小到大的顺序从左至右依次存储;这样可以提高存储密度并减小树的高度;因直接插入排序在数据量不超过20时效率最高,所以取Beta=20。
[0030]在算法运行过程中要保持每个结点索引项数组中的数据有序,该有序性由传统的直接插入排序来完成,并且其左、右子树上的索引项数基本平衡,为保持左、右子树的平衡,二叉排序树也要做适当的调整,由于每个结点可存放多个数据项,因此其调整的频率远远低于传统的平衡二叉树构造过程中的调整频度。
[0031]步骤4:读取索引文件的数据,根据索引项关键字的值在区间表中查询区间,将读取的索引数据按照步骤2中设定的二叉排序树的索引项插入方法插入到对应区间的二叉排序树上;其中,二叉排序树的索引项插入方法为:
[0032]步骤201:判断查询到的区间内是否已满,如果区间已满,在查询到的区间的右侧创建一个新的区间,将原区间中的二叉排序树的右子树从原二叉排序树中分裂出来并移至新的区间中,同时将原二叉排序树的树根移至其左子树的右脊梁的末端,并根据平衡要求调整二叉排序树;如果查找到的区间未满,则进行下一步操作;
[0033]其中,根据平衡要求调整二叉排序树的方法为:如果二叉排序树的左子树上存储的数据量大于二叉排序树的右子树存储的数据量与两倍的索引项数组中存储索引项的上限之和,就将二叉排序树的左子树的右脊梁末端结点做二叉排序树的根,将原根移至其右子树的左脊梁的末端;如果二叉排序树的的右子树上存储的数据量大于二叉排序树的左子树存储的数据量与两倍的索引项数组中存储索引项的上限之和,就将二叉排序树的右子树的左脊梁末端结点做二叉排序树的根,将原根移至其左子树的右脊梁的末端。
[0034]步骤202:将读取的索引项的索引关键字的值与二叉排序树的树根中存储的索引关键字值进行比较,如果读取的索引项的索引关键字值比二叉排序树的树根中的索引项数组中最左端的索引关键字的值小,则将读取的索引项递归地插入到二叉排序树的左子树中;相反,如果读取的索引关键字值比二叉排序树的树根中的索引项数组中最右端的索引关键字的值大,则将读取的索引项值递归地插入到二叉排序树的右子树中;如果读取的索引关键字的值介于索引项数组中最左端的索引关键字的值和最右端的索引关键字的值之间,查看二叉排序树的树根中设置的索引项数组中存储的数据是否已满,如果未满,则按照索引项存储的顺序将读取索引项插入到索引项数组中;如果已满,则将二叉排序树的树根进行结点分裂,产生一个新结点,把索引项数组中左半边索引项留在原结点,右半边索引项存储到新结点中;如果左子树中存储的索引项数多于右子树中存储的索引项数,则将新结点移至根的右子树的左脊梁的末端,否则将原结点移至根的左子树的右脊梁的末端。此种调整的目的是要保持一棵二叉树上左、右子树上的数据量基本相等,采用这种二叉排序树调整方法能够在最小的调整幅度下调整二叉排序树。
[0035]步骤5:按照区间的顺序对每个区间中相应的二叉排序树进行中序遍历,同时对每个结点中的索引项数组顺序读取,并将读取的结果保存到排序文件中。
[0036]对于未来增加的索引项只要按其关键字值运用折半查找的方法放入相应的区间排序即可,这样就实现了增量式排序。
[0037]在本发明提供的方法中,在区间表搜索阶段:除对
【权利要求】
1.一种大数据索引的排序方法,其特征在于:包括以下步骤: 步骤1:根据索引关键字的取值范围将索引初始划分为Size/Alpha个区间,其中,
2.根据权利要求1所述的一种大数据索引的排序方法,其特征在于:所述步骤2中二叉排序树的索引项插入方法为: 步骤201:判断查询到的区间内是否已满,如果区间已满,在查询到的区间的右侧创建一个新的区间,将原区间中的二叉排序树的右子树从原二叉排序树中分裂出来并移至新的区间中,同时将原二叉排序树的树根移至其左子树的右脊梁的末端,并根据平衡要求调整二叉排序树;如果查找到的区间未满,则进行下一步操作; 步骤202:将读取的索引项的索引关键字的值与二叉排序树的树根中存储的索引关键字值进行比较,如果读取的索引项的索引关键字值比二叉排序树的树根中的索引项数组中最左端的索引关键字的值小,则将读取的索引项递归地插入到二叉排序树的左子树中;相反,如果读取的索引关键字值比二叉排序树的树根中的索引项数组中最右端的索引关键字的值大,则将读取的索引项值递归地插入到二叉排序树的右子树中;如果读取的索引关键字的值介于索引项数组中最左端的索引关键字的值和最右端的索引关键字的值之间,查看二叉排序树的树根中设置的索引项数组中存储的数据是否已满,如果未满,则按照索引项存储的顺序将读取索引项插入到索引项数组中;如果已满,则将二叉排序树的树根进行结点分裂,产生一个新结点,把索引项数组中左半边索引项留在原结点,右半边索引项存储到新结点中;如果左子树中存储的索引项数多于右子树中存储的索引项数,则将新结点移至根的右子树的左脊梁的末端,否则将原结点移至根的左子树的右脊梁的末端。
3.根据权利要求2所述的一种大数据索引的排序方法,其特征在于:所述步骤201中根据平衡要求调整二叉排序树的方法为:如果二叉排序树的左子树上存储的索引项的数量大于二叉排序树的右子树存储的索引项的数量与两倍的索引项数组中存储索引项的上限之和,就将二叉排序树的左子树的右脊梁末端结点做二叉排序树的根,将原根移至其右子树的左脊梁的末端;如果二叉排序树的的右子树上存储的索引项的数量大于二叉排序树的左子树存储的索引项的数量与两倍的索引项数组中存储索引项的上限之和,就将二叉排序树的右子树的 左脊梁末端结点做二叉排序树的根,将原根移至其左子树的右脊梁的末端。
【文档编号】G06F17/30GK103745008SQ201410040926
【公开日】2014年4月23日 申请日期:2014年1月28日 优先权日:2014年1月28日
【发明者】石冰, 韩立新 申请人:河海大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1