磁盘区间树批量更新方法与流程

文档序号:12271565阅读:381来源:国知局
磁盘区间树批量更新方法与流程

本发明是数据库领域,用于同步实时数据更新而引起的索引结构更新。

二、

背景技术:

随着应用发展,数据存储对象由历史数据转变为连续变化的数据,如交通流量监控这些应用。在这些应用中,数据存储在数据库中并支持进一步的查询,这要求数据库系统不仅能存储历史数据,同时也能存储新数据。因此数据库中的索引结构必须支持频繁的更新,来保持与实时数据的同步,从而达到正确且有效的查询。

在时空数据库中,区间树用来有效的组织表示为轴平行线段的区间,每个区间包含一个开始和结束端点。对于存储在磁盘上的区间树,给定新的区间,将这些区间插入到区间树中存在两种方法:1)重新建造整棵树,这种方法开销大,尤其是对连续更新的数据来说,新区间可能只需更新部分结点,并不需要重构整棵树;2)将每个区间依次插入树中,这种方法会在区间数量太多时产生大量I/O开销和CPU开销。因此需要一种方法来有效的提高磁盘区间树索引更新,减小I/O开销和CPU开销,实现索引和实时更新数据的同步。

三、

技术实现要素:

【发明目的】

为了提高索引更新效率,本发明提供了包含新区间预处理、内区间更新算法和外区间更新算法,减小I/O开销和CPU开销,提高索引实时更新效率。

【技术方案】

本发明所述的磁盘区间树批量更新方法是通过将新区间预处理划分为内区间集合(在原区间树的范围内)和外区间集合(在原区间树的范围外)。对于两类集合分别调用内区间更新算法和外区间更新算法。这种批量更新算法能有效的对实时数据建立索引,解决实时区间数据范围超过端点值的问题,批量处理可减少磁盘访问次数,降低CPU开销。主要步骤如下:

(1)区间预处理;

本发明考虑数据空间持续增大的情况,将新区间数据分为三种:1)区间完全包含在原区间树的范围内的内区间集合;2)区间全部在原区间树的范围外的外区间集合;3)区间部分包含在区间树的范围内,部分在区间树的范围外的集合。将3)中区间根据区间树的最大值端点,分割为内区间部分和外区间部分,将分割后的两类子区间分别加入内区间集合和外区间集合中。最终得到的两类区间集合:内区间集合和外区间集合。

(2)内区间更新;

对于经过区间预处理后的内区间集合,找到每个区间在区间树中应存放的结点。遍历一次区间树,对于每个访问的结点,将当前结点对应的集合分为:1)存储在当前结点的区间,2)存储在当前结点左子树的区间,3)存储在当前结点右子树的区间,一次遍历后找到了所有区间应该插入的正确位置,区间树每个结点只访问更新一次,并适当进行旋转变化,保持树平衡。

(3)外区间更新;

对于外区间集合,为集合中的区间建立一棵新的平衡区间树。建树完成后,以新的区间树中的结点为单位,将结点依次插入磁盘区间树中,并同时作适当的旋转调整变换保持树的平衡。

【有益效果】

本发明所述磁盘区间树批量更新方法通过对区间集合预处理,内区间更新和外区间更新,以实现同步实时数据和磁盘区间树索引结构的更新。下面通过测试数据来说明本发明的有效性。实验环境为:Intel(R)、Xeon(R)、CPU为i7-4770、主频3.4GHz、内存8GB、磁盘2TB、Linux环境Ubuntu14.04、C++语言、可扩充移动对象数据库SECONDO,实验数据为合成数据和北京出租数据。

表1

表1显示了数据集的信息,图1(a)表示重新建树(DropRebuild)、以区间为单位更新(Baseline)及批量更新(BulkLoad)三种方法在合成数据上的时间比较,图1(b)表示三种方法在出租数据上的时间比较,图3(c)表示比较不同数据量的历史数据对三种方法的影响,三种情况都表明磁盘区间树批量更新方法性能对比另外两种方法有较大提高。

四、附图说明

图1实验结果对比图

图2区间分割示意图

图3区间树构造示意图

图4内区间更新

图5区间树平衡旋转变换

五、具体实施方式

下面结合附图对本发明进一步说明。

本发明所述的磁盘区间树批量更新方法是通过对区间进行预处理,以如图2所示区间树的有效范围端点最大值Max为分割点,将所有新区间分为内区间集合和外区间集合。通过对两种不同的区间采用内区间更新和外区间更新算法,实现实时数据和磁盘区间树索引的同步,减少磁盘访问次数,降低CPU开销。主要步骤如下:

(1)区间预处理;

本发明将需要更新的区间集合作为输入,保存到可扩充数据库系统SECONDO中。每个区间如图3所示,保存在由上至下遍历整棵树,得到的与该区间相交的第一个中心点所在的结点处。如图3a中,区间o1同时与图中两个中心点相交(即与图3a中两条虚线相交),由于第二个中心点为上层结点,因而将o1如图3b所示保存在父结点中。

如图2所示,区间树的定义范围存在最小最大端点值,考虑到数据空间的增长,因此仅考虑区间数据在Max方向的增加。给定一个新的区间,区间和最大值端点Max存在如图2所示关系:1)图2a表示区间包含于区间树定义范围内,2)图2b表示区间完全在区间树的定义范围外,3)图2c表示区间部分包含于区间树定义范围内,部分在定义范围外。

对区间进行预处理有以下三种情况:1)对于图2a中所有区间,将它们全部保存在内区间集合中;2)对于图2b中所有区间,保存在外区间集合中;对于图2c中的区间集合,按区间树的定义范围的最大端点值Max,将区间分割为两个部分,将在定义范围内部的区间放入内区间集合中,定义范围外的区间放入外区间集合中。区间预处理后,所有的区间分为两个部分,内区间集合和外区间集合,对两种不同的集合分别采用内区间更新算法和外区间更新算法,对区间树进行更新操作,得到更新后的区间树。将更新的结点放在缓冲区中,最后调用更新算法,一次更新所有结点。具体算法如下所示:

算法1.BulkUpdate(T,O′)

输入:磁盘区间树索引T

区间集合O′

输出:更新后的磁盘区间树索引

1.将集合O′分为{O′in,O′out};

2.Insert_In(T,T.Tootld(),O′in);

3.Insert_Out(T,O′out);

4.将缓冲区中的结点更新同步到磁盘上的索引结构

(2)内区间更新;

区间预处理将所有区间分为内区间集合和外区间集合,对于预处理后的内区间集合采用内区间更新算法,得到各个区间更新后所在的位置。主要步骤如下:

1.从根结点开始由上至下遍历区间树;

2.对于访问的结点,对当前区间集合进行集合划分,找到每个区间应存放结点的位置;

3.以结点为单位完成对磁盘区间树的更新操作。

从根结点开始由上至下遍历区间树,对每个访问的结点,可将新区间集合通过集合划分,分为三部分:1)存放在当前结点的左子树的区间组成的左子树集合,2)存放在当前结点的右子树的区间组成的右子树集合,3)存放在当前结点的区间集合。对1)将左子树集合作为左子结点的新区间集合进行集合划分,找到每个区间对应的位置,2)中右子树集合则和右子结点结合进行划分。在内区间更新过程中,每个结点仅访问更新一次,区间存放在第一个与其相交的中心点所在的结点处。

内区间更新过程如图4所示,{o′1,o′2,o′5,o′3a}为内区间集合,对父结点和新区间集合进行集合划分,得到{o′5},{o′3a},{o′1,o′2}。{o′1,o′2}与结点中心点(对应虚线)相交,因此保存在当前结点中,{o′5}在虚线左侧,因此保存在结点的左子树集合中,{o′3a}在中心点右侧,保存在结点的右子树集合中。对每个访问结点重复上诉步骤,最终得到更新后的磁盘平衡区间树如图4b所示,{o′1,o′2}保存在父结点中,{o′5}、{o′3a}分别保存在左结点和右结点的左子树和右子树中。

在为区间寻找合适的结点插入的过程中,可能存在不包含任何结点的中心点的区间,如图5a所示区间o′4,因此需要为这种区间新建一个结点并插入到树中。新结点o′4的插入导致树不平衡,因此需要进行旋转平衡处理如图5b所示,使区间树重新达到平衡。平衡树在经过旋转操作后,可能导致父子结点关系转换,根据定义区间保存在第一个与其相交的中心点所在的结点处,因此在旋转变换后应考虑是否需要将子结点中的区间调整至新的父节点中。经过旋转变换后的o′3变为新的父结点,由图5a看出原父结点中的区间o6与o′3的中心点相交,由区间树定义可知,应将o6存放在第一个相交的中心点在的结点,即o′3所在的结点处。因此如图5c将o6存入新的父结点中,得到最终结果。相较于重新建树和依次将区间插入区间树中两种方法,以结点为单位更新磁盘区间树可大量减少磁盘访问次数和CPU开销。具体算法如下所示:

算法2.Insert_In(T,id,O′in)

输入:磁盘区间树T

当前结点编号id

内区间集合O′in

输出:根据当前结点分类得到的三类区间

1.

2.N←GetNode(T,id);

3.foreach o′∈O′in do

4.if o′包含N.p then Om←o′;

5.else

6.if N.p<o′then Or←o′;

7.if N.p>o′then Ol←o′;

8.由结点N将区间分为Ol、Om、Or

9.if N.lp>0then Insert_In(T,N.lp,Ol);

10.else Insert_Out(T,Ol);

11.if N.rp>0then Insert_In(T,N.rp,Or);

12.else Insert_Out(T,Or);

13.if更新后的树不平衡

14.then进行旋转变换,并调整区间位置;

(3)外区间更新;

将区间插入区间树中将产生两种情况,1)区间与某个结点的中心点相交,将区间存入第一个相交的结点中,2)区间不与任何中心点相交,为当前区间新建一个结点插入到区间树中。对于预处理后的外区间集合中的所有区间,与磁盘区间树结点的中心点均不存在交点,因此集合中的所有区间都不会保存在磁盘区间树的原有结点中。因此可以为外区间集合新建一棵区间树,外区间集合中的所有区间被划分到不同的结点中,再将新树中的结点依次插入到原磁盘区间树中,在新结点插入过程中适当进行旋转平衡处理,保证磁盘区间树的平衡。这种方法解决了超过定义范围内的区间索引的问题,同时降低了I/O和CPU开销,提高索引更新效率。具体算法如下所示:

算法3.Insert_Out(T,O′out)

输入:磁盘区间树T

区间外集合Out′out

输出:同步更新数据的平衡磁盘区间树

1.在O′out上新建一棵区间树T′;

2.foreach N′∈T′do;

3.将结点N′插入区间树T中。

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