分布式内存列式数据库的生成代码复用匹配管理方法与流程

文档序号:18360205发布日期:2019-08-06 23:43阅读:188来源:国知局
分布式内存列式数据库的生成代码复用匹配管理方法与流程

本发明涉及分布式内存列式数据库的编译执行方式下匹配复用以及管理动态生成的代码的方法技术领域,具体涉及分布式内存列式数据库的生成代码复用匹配管理方法。



背景技术:

在经典的数据库火山模型中,执行流程从语法树根节点开始,递归调用子节点处理函数进行处理,到达叶节点后取出相应表的一行数据进行处理并依次返回。在每次递归调用流程中只对一行数据进行处理导致了很差的代码局部性,包括过多的函数调用;还导致了很差的数据局部性,因为每次读取只需要一部分数据,进而使得cpucache频繁换入换出。因而火山模型极度不适合海量数据的分析处理。

在海量数据分析处理系统中(包括sparksql等),普遍使用的是向量化(vectorization)模型,即一种批处理模型。在向量化模型中,每次取出一列或几列进行批处理运算,再对结果与其他列进行运算;其整个流程用有向无环图dag表示,则一次批处理运算代表一个节点,完成该节点运算后将结果推送到其他节点。这种模型具有很好的代码局部性和数据局部性。但其需要多次大量地将中间结果写入内存(即物化)。

于是,一些数据库,如hyper,提出了pipeline的执行模型,将多次批处理运算融合到一个pipeline计算中。在能够融合的多次批处理运算形成的pipeline中,在单个函数中,每次对单个元组进行计算并传递,最终能减少物化。

但pipeline执行方式的效率提升依赖于:

1、需要能够根据执行计划动态生成合适的pipeline代码,以合并对多个批处理的计算,因为难以在开发时即抽象出各种满足所有功能需求的算子;

2、需要将处理代码以及其调用的函数尽可能上提或内联,减少函数调用,提升代码局部性;同时在运行时生成执行代码能利用运行时信息提升代码质量。

目前,现有的代码生成和复用方法使用了llvm对表达式,如聚合函数、排序函数、数据预取函数等进行生成、缓存,并在下次使用时进行查询,其将函数表示为一定的格式字符串以代表函数的功能,如int型的相加表示为类似“int_plus_int”这样的字符串。但现有的代码生成和复用方法存在如下的缺点:该表示和匹配方法十分粗略,无法适应表达式的各种复杂情况,如对一复杂的等价表达式的匹配和复用,其无法满足情况;并且,未提出关于pipeline代码的匹配方法。



技术实现要素:

本发明所要解决的技术问题是:现有的代码生成和复用方法十分粗略,无法适应表达式的各种复杂情况,对一复杂的等价表达式的匹配和复用,其无法满足情况;并且,未提出关于pipeline代码的匹配方法。本发明提供了解决上述问题的分布式内存列式数据库的生成代码复用匹配管理方法,实现对生成代码的映射关系管理方法,包括创建多个属性、属性具体的内容,给出了对pipeline生成代码的等价性比较方法和对表达式代码的等价性比较方法,以及对含常量表达式进行抽象再生成代码的方法。

本发明通过下述技术方案实现:

分布式内存列式数据库的生成代码复用匹配管理方法,包括:

创建映射关系,包括:

对数据库中每个生成的代码请求,在缓存复用管理器中创建kv映射关系,kv映射关系表示为<属性,代码标识>;

匹配等价性,包括:

从缓存复用管理器中的kv映射关系读取属性,对待生成计划代码进行功能等价性匹配,若匹配成功,则实现代码缓存复用;若匹配失败,则执行创建映射关系。

本发明的工作原理是:基于现有的代码生成和复用方法十分粗略,无法适应表达式的各种复杂情况,对一复杂的等价表达式的匹配和复用,其无法满足情况;并且,未提出关于pipeline代码的匹配方法。本发明通过上述方案提出一种复用llvm生成的代码的匹配方法,以及对生成代码的管理方法,首先对每个生成的代码,在缓存复用管理器中创建kv(key-value)映射关系,以便于进行匹配和查找,kv映射关系表示为<属性,代码标识>;然后,从缓存复用管理器中的kv映射关系读取属性,对待生成计划代码进行功能等价性匹配,若匹配成功,检查新增等价映射,实现代码缓存复用;若匹配失败,则返回执行创建新的映射关系;这里的功能等价性匹配不同于相等匹配,进而能够识别从功能上兼容的代码。

进一步地,kv映射关系表示为<属性,代码标识>,基于可能存在多个不同的kv对,其代码标识相同,即多个属性对应同样的代码,因此,属性与代码标识之间是多对一的对应关系。

其中:针对生成的代码包括pipeline代码和表达式代码如下两种:

进一步地,针对生成的代码为pipeline代码,pipeline代码的<属性,代码标识>映射的属性值包括的内容有(pipeline长度,各pipeline节点的功能);

匹配等价性,从缓存复用管理器中的kv映射关系读取属性,对待生成计划代码进行功能等价性匹配,其中,待生成计划代码的属性表示为(pipeline长度1,各pipeline节点功能1),已有的代码属性表示为(pipeline长度2,各pipeline节点功能2);

(1)当pipeline长度1<=pipeline长度2,将pipeline节点功能1组成的功能节点序列1中的每个节点放置到pipeline节点功能2组成的功能节点序列2中,如果放置后,功能节点序列1仍然保持原有的相对序列则匹配等价性成功;因为对于pipeline功能序列2中未匹配的点,可以置空并在运行时直接跳过。

(2)如果放置结果中相对顺序不严格保持原有顺序,则判断该顺序是否仍能保持正确性,对于连续相同功能的代码节点进行顺序互换。比如,连续的filter节点可以进行顺序互换而不影响正确性。

进一步地,针对生成的代码为表达式代码,表达式代码的<属性,代码标识>映射的属性为表达式树形式或者可格式化为字符串形式。

(1)在表达式生成时,通过逻辑转换,创建对应代码的多个等价表达式值。比如,“(int+int)*long”等价于“int*long+int*long”。

(2)对表达式含常量的,可继续创建生成带常量版和不带常量版,比如针对表达式“int+1024”生成代码后,可检测并另外生成”int+int”的版本并另外创建<属性,代码标识>映射关系。

匹配等价性,(1)针对待生成表达式不带常量的,进行相等匹配,这是由于在加入映射关系时已经添加了各种等价性的属性,因而此处的匹配数据相等匹配;(2)针对待生成表达式带常量的,则该常量位置既可以用相应类型的变量匹配也可以用相等的常量进行匹配。

其中:llvm是一个编译器后端框架,提供了便捷地生成llvmir语言代码的方法以及将llvmir语言代码编译成可执行的工具。从llvm衍生出的c++编译器clang将c++代码编译成ir代码,进而通过llvm工具编译成可执行文件。

llvm提供c/c++库以方便地生成llvmir语言组成的代码,如函数等。llvmir是易读的,类似于汇编但其抽象性隐藏了底层具体硬件特性;llvmir也是跨平台的,即同一份llvmir可在不同cpu的机器甚至gpu上执行。llvm提供工具将ir编译成适应特定机器上的可执行代码,也可在按照解释执行方式执行。

在测试中发现llvmir代码编译时间相对运算时间过长,甚至在部分数据集上计算时超过实际运算时间。

本发明具有如下的优点和有益效果:

1、本发明提出了在分布式内存数据库编译执行方式下对生成的代码的复用匹配和元信息管理方法,以减少重复生成代码导致的代码生成和编译成可执行代码的时间过长问题;

2、本发明提出了两种类型的代码复用匹配方法,包括pipeline代码和表达式计算的代码匹配方法,pipeline执行方式是新一代的执行方式,而表达式计算是十分常用的且涵盖范围广、变化多的计算,因而对其进行缓存复用能减少生成编译次数与时间,同时发明中提出了每个pipeline代码和表达式计算代码能够涵盖相近的一类运算,因而可以进一步复用。

附图说明

此处所说明的附图用来提供对本发明实施例的进一步理解,构成本申请的一部分,并不构成对本发明实施例的限定。在附图中:

图1为本发明的生成代码复用匹配方法流程图。

图2为本发明实施例1的pipeline匹配方法图。

图3为本发明实施例2的等价表达式示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本发明作进一步的详细说明,本发明的示意性实施方式及其说明仅用于解释本发明,并不作为对本发明的限定。

实施例1

如图1所示,分布式内存列式数据库的生成代码复用匹配管理方法,包括:

创建映射关系,包括:

对数据库中每个生成的代码请求,在缓存复用管理器中创建kv映射关系,kv映射关系表示为<属性,代码标识>;

匹配等价性,包括:

从缓存复用管理器中的kv映射关系读取属性,对待生成计划代码进行功能等价性匹配,若匹配成功,则实现代码缓存复用;若匹配失败,则执行创建映射关系。

其中:kv映射关系表示为<属性,代码标识>,基于可能存在多个不同的kv对,其代码标识相同,即多个属性对应同样的代码,因此,属性与代码标识之间是多对一的对应关系。

图1为本发明的生成代码复用匹配方法流程图,针对代码匹配请求任务,如下给出一个完整的流程,首先进行功能等价性匹配,如果匹配成功,检查新增kv等价映射,实现代码缓存复用;如果匹配失败,执行生成代码请求,创建kv映射关系,并创建kv等价映射关系。其中,映射关系kv表示为<属性,代码标识>,kv等价映射关系表示为<等价属性,代码标识>。

如图2为pipeline代码匹配等价性,虽然待生成的pipeline长度小于已有pipeline,各节点能放入已有pipeline中,并且虽然顺序不完全相同,但连续的filter间可进行交换而不影响正确性,而此处filter_float无法交换至join_left前,因为join操作相当于barrier,禁止进行交换。

本实施例为pipeline代码复用,针对生成的代码为pipeline代码,pipeline代码的<属性,代码标识>映射的属性值包括的内容有(pipeline长度,各pipeline节点的功能);

匹配等价性,从缓存复用管理器中的kv映射关系读取属性,对待生成计划代码进行功能等价性匹配,其中,待生成计划代码的属性表示为(pipeline长度1,各pipeline节点功能1),已有的代码属性表示为(pipeline长度2,各pipeline节点功能2);

(1)当pipeline长度1<=pipeline长度2,将pipeline节点功能1组成的功能节点序列1中的每个节点放置到pipeline节点功能2组成的功能节点序列2中,如果放置后,功能节点序列1仍然保持原有的相对序列则匹配等价性成功;因为对于pipeline功能序列2中未匹配的点,可以置空并在运行时直接跳过。

(2)如果放置结果中相对顺序不严格保持原有顺序,则判断该顺序是否仍能保持正确性,对于连续相同功能的代码节点进行顺序互换。比如,连续的filter节点可以进行顺序互换而不影响正确性。

如图2所示,首先上层提出了生成代码的请求,该代码的功能需要对表a的a列(int整型类型)进行filter操作,接着对a表的b列(string字符串类型)进行filer操作,接着对a表的c列(double浮点类型)进行filter操作,最后a表d列(int整型类型)生成哈希表。其中,表a如下:

表a

由于系统中不存在该功能代码因而会生成ir和可执行代码(暂时称作代码1),并在缓存复用管理器内部使用的元数据管理器的映射对中形成<<4,filter_int,filter_string,filter_double,join_left_int>,代码1>,其中,缓存复用管理器需要管理相关元数据信息,因而其内部使用元数据管理器进行管理。

当下次有相同代码生成请求时候即可直接通过如上映射关系查找并返回代码1。此时有相似的生成代码需求,其功能为先对b表x列(string字符串类型)进行filter操作,接着对b表y列(int整型类型)进行filer操作,最后最b表z列(int整型类型)生成哈希表。该方法的属性可以表示为<3,filter_string,filter_int,join_left_int>,经过逻辑正确性交换后为<3,filter_int,filter_string,join_left_int>,再经过插入不影响正确性的空值后为<4,filter_int,filter_string,null,join_left_int>。最终该属性能够和已有的<<4,filter_int,filter_string,filter_double,join_left_int>,代码1>中的属性进行匹配并返回代码1以完成该功能。在利用代码1完成后一个功能的计算时,只需要将传入filter_doulbe参数置空则可跳过其计算以完成后续的功能。其中,表b如下:

表b

实施例2

如图3所示,本实施例与实施例1的区别在于,针对生成的代码为表达式代码,表达式代码的<属性,代码标识>映射的属性为表达式树形式或者可格式化为字符串形式。

(1)在表达式生成时,通过逻辑转换,创建对应代码的多个等价表达式值。比如,“(int+int)*long”等价于“int*long+int*long”。

(2)对表达式含常量的,可继续创建生成带常量版和不带常量版,比如针对表达式“int+1024”生成代码后,可检测并另外生成”int+int”的版本并另外创建<属性,代码标识>映射关系。

匹配等价性,(1)针对待生成表达式不带常量的,进行相等匹配,这是由于在加入映射关系时已经添加了各种等价性的属性,因而此处的匹配数据相等匹配;(2)针对待生成表达式带常量的,则该常量位置既可以用相应类型的变量匹配也可以用相等的常量进行匹配。

如图3所示,首先上层提出生成表达式代码的计算请求,该代码的功能是需要对a变量(int整型类型)和b变量(long类型)相乘,对c变量(float类型)和d变量(long类型)相乘,最后对两者结果相加。

由于系统中不存在该表达式计算代码,因而会生成代码2,并在缓存复用管理器内部使用的元数据管理器中形成映射对<<“(int*long)+(float*long)”>,代码2>。接着再经过等价性演绎产生<<“(int+float)*long”>,代码2>,还可经过类型兼容性演绎产生<<“(short+float)*int”>,代码2>等。

当下次有相同的表达式计算功能请求时则直接返回代码2。此时有相似的表达式计算代码请求,其功能为对变量x(int型)和变量y(long型)相加之后再和变量z(long型)相乘。则可通过代码2进行该计算。

本发明提出了在分布式内存数据库编译执行方式下对生成的代码的复用匹配和元信息管理方法,以减少重复生成代码导致的代码生成和编译成可执行代码的时间过长问题;本发明具体给出两种类型的代码复用匹配方法,包括pipeline代码和表达式计算的代码匹配方法,pipeline执行方式是新一代的执行方式,而表达式计算是十分常用的且涵盖范围广、变化多的计算,因而对其进行缓存复用能减少生成编译次数与时间,同时发明中提出了每个pipeline代码和表达式计算代码能够涵盖相近的一类运算,因而可以进一步复用。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

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