图数据库内存管理方法、系统、电子设备及存储介质

文档序号:7754 发布日期:2021-09-17 浏览:38次 英文

图数据库内存管理方法、系统、电子设备及存储介质

技术领域

本申请涉及图数据库

技术领域

,特别是涉及基于静态分析的图数据库内存管理方法、系统、电子设备及存储介质。

背景技术

随着零售、金融、电商、互联网以及物联网等行业的兴起,图数据库被应用的越来越广泛。

目前,对于图数据库中的内存管理十分粗糙,经常采用的方式为对中间变量不做额外的处理,等查询执行完成后,统一释放所有变量,而许多中间变量在查询过程已经没有作用了,但是仍然没有释放,如此不仅造成大量无效的内存占用而且也增加了查询时间,这种方式虽然对于简单的查询而言可以正常工作,但是对于大数据量的查询或者并发进行的大量查询而言,由于内存占用不断的大量增长,会导致查询失败甚至服务异常退出的问题,如此,降低了图数据库运行的稳定性。

发明内容

本申请实施例提供了一种基于静态分析的图数据库内存管理方法、系统、电子设备及存储介质,以至少解决相关技术中大数据量的查询或者并发进行的大量查询时,由于内存占用大量增长,导致查询失败甚至服务异常的问题。

第一方面,本申请实施例提供了一种基于静态分析的图数据库内存管理方法,所述方法包括:

通过语法树生成图数据库的执行计划,并在生成所述执行计划时注册映射表,所述映射表用于存储变量及相应的变量值,且所述执行计划包括多个算子;

通过先序遍历找出各个变量的最终使用者;

在执行所述执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完所述当前算子后,释放所述输入的变量对应的变量值,其中,当前输入的变量的算子称为当前算子。

在其中一些实施例中,所述执行计划的执行顺序为先执行当前算子的依赖算子,再执行所述当前算子。

在其中一些实施例中,所述先执行当前算子的依赖算子,再执行所述当前算子的步骤包括:

判断所述当前算子是否有分支算子和/或依赖算子;

若所述当前算子没有所述分支算子和/或所述依赖算子,则所述当前算子为叶子节点;

从所述叶子节点开始执行所述当前算子。

在其中一些实施例中,所述通过先序遍历分析当前算子是否为输入的变量的最终使用者包括:

以和所述执行顺序相反的顺序遍历所述执行计划,第一个引用所述输入变量的算子则为所述最终使用者。

在其中一些实施例中,在向所述映射表存储变量及相应的变量值之前,所述方法还包括:

若判断变量无算子使用,则不向所述映射表存储该变量对应的变量值。

在其中一些实施例中,所述映射表中存储有变量名,且所述变量名的个数在注册后保持不变。

在其中一些实施例中,所述算子包括重组算子、截断算子、循环算子、过滤算子、索引扫描算子或邻点获取算子中的一种或多种组合。

第二方面,本申请实施例提供了一种基于静态分析的图数据库内存管理系统,该系统包括:

生成模块,用于根据语法树成所述图数据库的执行计划,并在生成所述执行计划时注册映射表;

分析模块,在执行当前输入变量的算子之前,用于根据先序遍历分析所述当前输入变量的算子是否为最终使用者,并输出相应的分析结果;

管理模块,在执行完所述当前输入变量的算子之后,用于根据所述分析结果释放所述输入变量对应的变量值或将所述变量值存储至所述映射表。

第三方面,本申请实施例提供了一种电子设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序时实现如上述第一方面基于静态分析的图数据库内存管理方法。

第四方面,本申请实施例提供了一种存储介质,该存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行时实现如上述第一方面所述的基于静态分析的图数据库内存管理方法。

相比于相关技术,本申请实施例提供的一种基于静态分析的图数据库内存管理方法,通过语法树生成图数据库的执行计划,并在生成执行计划时注册映射表,在执行执行计划的之前,通过先序遍历找出各个变量的最终使用者,在执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完当前算子后,释放输入的变量对应的变量值,相较于之前图数据库运行的稳定性差,采用的方式为对中间变量不做额外的处理,等查询执行完成后,统一释放所有变量,而对于大数据量的查询或者并发进行的大量查询而言,由于内存占用不断的大量增长,还未等到整个查询执行完成,就会导致查询失败甚至服务异常退出的问题,本申请实施例在执行执行计划的之前,通过先序遍历找出各个变量的最终使用者,也就是说分析当前算子是否是输入变量的最终使用者这一步之前就已经分析完成了,执行的时候通过读取分析结果(分析当前算子是否是输入变量的最终使用者)直接判断即可,最后,在执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完当前算子后,释放输入的变量对应的变量值,也就是执行计划过程中,实时对输入变量的最终使用者的内存进行释放,极大的减少了无效内存的占用,解决了对于大数据量的查询或者并发进行的大量查询而言,由于内存占用不断的大量增长导致查询失败甚至服务异常退出的问题,本实施例降低了无效内存的占用,同时提高了图数据库运行的稳定性。

附图说明

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

图1是根据本申请实施例的基于静态分析的图数据库内存管理方法的第一流程示意图;

图2是根据本申请实施例的先执行当前算子的依赖算子,再执行所述当前算子的步骤的第一流程示意图;

图3是根据本申请实施例的先执行当前算子的依赖算子,再执行所述当前算子的步骤的第二流程示意图;

图4是根据本申请实施例的通过语法树生成图数据库的执行计划的一流程示意图;

图5是根据本申请实施例的基于静态分析的图数据库内存管理系统的结构框图;

图6是根据本申请实施例的电子设备的内部结构示意图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。基于本申请提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本申请公开的内容相关的本领域的普通技术人员而言,在本申请揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本申请公开的内容不充分。

在本申请中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本申请所描述的实施例在不冲突的情况下,可以与其它实施例相结合。

除非另作定义,本申请所涉及的技术术语或者科学术语应当为本申请所属技术领域内具有一般技能的人士所理解的通常意义。本申请所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本申请所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本申请所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本申请所涉及的“多个”是指大于或者等于两个。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。本申请所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。

目前,对于图数据库中的内存管理十分粗糙,经常采用的方式为对中间变量不做额外的处理,等查询执行完成后,统一释放所有变量,而许多中间变量在查询过程已经没有作用了,但是仍然没有释放,如此不仅造成大量无效的内存占用而且也增加了查询时间,这种方式虽然对于简单的查询而言可以正常工作,但是对于大数据量的查询或者并发进行的大量查询而言,由于内存占用不断的大量增长,会导致查询失败甚至服务异常退出的问题,如此,降低了图数据库运行的稳定性。

为了解决上述问题,本申请提出一种基于静态分析的图数据库内存管理方法,该基于静态分析的图数据库内存管理方法可以用零售、金融、电商、互联网以及物联网等行业,图1是根据本申请实施例的基于静态分析的图数据库内存管理方法的第一流程示意图,如图1所示,该方法包括:

步骤S101,通过语法树生成图数据库(Graph Database,又称图形数据库)的执行计划,并在生成所述执行计划时注册映射表,所述映射表用于存储变量及相应的变量值,且所述执行计划包括多个算子;其中,语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次。简单说,语法树就是按照某一规则进行推导时所形成的树。另外,需要说明的是,在本实施例中的本图数据库的执行计划从拓扑角度来说是由多个算子组成有向无环图(Directed Acyclic Graph,简称DAG),也就说生成的执行计划本身是一个有向无环图,在数学,特别是图论和计算机科学中,有向无环图指的是一个无回路的有向图。例如,如果有一个非有向无环图,且A点出发向B经C可回到A,形成一个环,那么将从C到A的边方向改为从A到C,则变成有向无环图。

步骤S102,通过先序遍历(Pre-order,先序遍历)找出各个变量的最终使用者;也就是说,在执行当前输入变量的算子之前,通过先序遍历找出各个变量的最终使用者,已经完成了分析当前算子是否是输入变量的最终使用者的过程,在后续执行的过程中通过读取分析结果(当前算子是否是输入变量的最终使用者)直接判断即可,如此,方便了后续的使用;需要说明的是,一般每一个变量都有一个最终使用者,即该输入变量的最终使用者为在算子执行过程中,最后一个使用该变量的算子。另外,本领域技术人员知道先序遍历为按照根左右的顺序沿一定路径经过路径上所有的结点,此处不在一一赘述。

步骤S103,在执行所述执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完所述当前算子后,释放所述输入的变量对应的变量值,其中,当前输入的变量的算子称为当前算子。如此,减少了无效的内存占用,提高了图数据库的稳定性。

值得注意的是,本文中通过静态分析减少内存并不是靠特定算子完成的,而是要分析由算子组成的执行计划,分析出每个算子输出的结果(输出的结果为输入变量对应的变量值)在哪个算子使用后就不再被使用,这时候释放掉这个结果(输入变量对应的变量值)占用的内存,从而达到减少无效内存占用的效果。

通过上述步骤S101至步骤S103,本实施例通过语法树生成图数据库的执行计划,并在生成执行计划时注册映射表,在执行执行计划的之前,通过先序遍历找出各个变量的最终使用者,在执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完当前算子后,释放输入的变量对应的变量值,相较于之前图数据库运行的稳定性差,采用的方式为对中间变量不做额外的处理,等查询执行完成后,统一释放所有变量,而对于大数据量的查询或者并发进行的大量查询而言,由于内存占用不断的大量增长,还未等到整个查询执行完成,就会导致查询失败甚至服务异常退出的问题,本申请实施例在执行执行计划的之前,通过先序遍历找出各个变量的最终使用者,也就是说分析当前算子是否是输入变量的最终使用者这一步在执行执行计划之前就已经分析完成了,执行的时候通过读取分析结果(分析当前算子是否是输入变量的最终使用者)直接判断即可,最后,在执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完当前算子后,释放输入的变量对应的变量值,也就是执行计划过程中,实时对输入变量的最终使用者的内存进行释放,极大的减少了无效内存的占用,解决了对于大数据量的查询或者并发进行的大量查询而言,由于内存占用不断的大量增长导致查询失败甚至服务异常退出的问题,本实施例降低了无效内存的占用,同时提高了图数据库运行的稳定性。

在本实施例中,执行计划的执行顺序为先执行当前算子的依赖算子,再执行所述当前算子;例如,假设我们有算子3,算子2,算子1这三个算子,算子3依赖算子2,算子2依赖算子1,算子1没有任何依赖,那么执行计划的执行顺序是算子1,算子2,算子3。当然在一些其他实施例中,执行计划的执行顺序还可以是其他,此处不做具体限定。

图2是根据本申请实施例的先执行当前算子的依赖算子,再执行所述当前算子的步骤的第一流程示意图,如图2所示,由于执行计划会有一些具有特殊含义的分支结构,比如循环和条件分支,循环分支在执行地时候会循环执行,条件分支在执行的时候会看条件值执行,为了满足执行计划的多样性,在一些其他其他实施例中,先执行当前算子的依赖算子,再执行所述当前算子的步骤包括:

步骤S201,判断当前算子是否有分支算子和/或依赖算子;其中,每个算子通过指针指向他的依赖算子,每个算子可以有任意个输入以及0-1个输出。

步骤S202,若当前算子没有分支算子和/或依赖算子,则当前算子为叶子节点;其中,本领域技术人员知道一棵树当中没有子结点(即度为0)的结点称为叶子结点,此处不在一一赘述。

步骤S203,从叶子节点开始执行当前算子。

图3是根据本申请实施例的先执行当前算子的依赖算子,再执行所述当前算子的步骤的第二流程示意图,如图3所示,进一步地,在另一实施例中,先执行当前算子的依赖算子,再执行所述当前算子的步骤还包括:

步骤S301,判断当前算子是否已经被使用;

步骤S302,若判断当前算子未被使用,则设当前算子为输入变量的最终使用者;也就是说若当前算子没有最终使用者的话,则说明当前算子其实没人会用,所以直接都不存在映射表里面,如此,减少无效内存占用。其中,本实施例中,判断当前算子是否已经被使用可以采用现有的判断当前算子是否被使用函数或算法来实现,当然在一些其他实施例中也可以采用其他占用内存更小函数或算法来实现,此处不做具体限定。

步骤S303,若判断当前算子已被使用,则再判断当前输入算子是否存在分支算子;其中,判断当前输入算子是否存在分支算子可以采用现有的是否存在分支算子的函数或算法来实现,当然在一些其他实施例中,也可以采用其他占用内存更小函数或算法来实现,此处不做具体限定。

步骤S304,若当前输入算子存在分支算子,则进入分支算子并执行分支算子;

步骤S305,若当前输入算子不存在分支算子,则继续向下执行步骤S305;

步骤S306,判断当前输入算子是否存在依赖算子,若当前算子不存在依赖算子,则释放当前算子;其中,判断当前输入算子是否存在依赖算子可以采用现有的是否存在依赖算子的函数或算法来实现,当然在一些其他实施例中,也可以采用其他占用内存更小函数或算法来实现,此处不做具体限定。

步骤S307,若当前输入算子存在依赖算子,则继续循环执行步骤S301,直到判断当前算子不存在依赖算子时,释放当前算子;

通过上述步骤S301至步骤S307,在本实施例中,若判断当前算子未被使用,则该算子输出的变量未被使用,直接都不存在映射表里面,如此,减少无效内存占用,然后,根据之前的分析结果(分析结果为分析当前算子是否是输入变量的最终使用者)判断当前算子是否是输入变量的最终使用者,如果是则释放对应的输入变量的值,如此,最大限度地减少了无效的内存占用,提高了图数据库的稳定性。

在一实施例中,通过先序遍历分析当前算子是否为输入的变量的最终使用者包括:

以和执行顺序相反的顺序遍历执行计划,第一个引用输入变量的算子则为最终使用者。

需要说明的是,正常的执行顺序是后续遍历,简单来说就是执行的时候,在执行一个算子的时候会先执行它依赖的算子,依赖的算子也会先执行他自己依赖的算子,这样一直遍历到执行计划的叶子节点,即一个没有依赖算子的算子,然后从这个算子往回执行。以算子3,算子2,算子1三个算子为例进行说明,算子3依赖算子2,算子2依赖算子1,算子1没有任何依赖,那么执行计划的执行顺序是算子1,算子2,算子3,本实施例以和执行顺序相反的顺序遍历算子3,算子2,算子1,第一个引用输入变量的算子是算子3,则算子3为最终使用者。如此,在执行计划遍历一遍之后,所有的变量的最终使用者都被分析了出来。然后在执行的时候,每个算子执行完成后检查一下是否是输入变量的最终使用者,如果是的话则释放该变量。如此在每个变量在最后一次被使用后就立即被释放,最大限度地减少了无效的内存占用。

在一些实施例中,在向映射表存储变量及相应的变量值之前,方法还包括:

若判断变量无算子使用,则不向映射表存储该变量对应的变量值。由与变量值会占用的空间较大,为了减少无效内存的使用,在判断变量无算子使用时,则不向映射表存储该变量对应的变量值。

此外,为了保证了并发执行的数据安全,在一些实施例中,映射表中存储有变量名,且变量名的个数在注册后保持不变。也就是说,在后续的执行计划中,不允许增加或者减少,如此保证了单个算子顺序写入,因此保证了并发执行的数据安全。

在一可选实施例中,该算子包括重组算子(Project)、截断算子(Limit)、循环算子(Loop)、过滤算子(Filter)、索引扫描算子(IndexScan)或邻点获取算子(GetNeighbors)中的一种或多种组合,当然在一些其他实施例中,根据实际需求,算子还可以包括其他类型的算子,此处不做具体限定;图4是根据本申请实施例的通过语法树生成图数据库的执行计划的一流程示意图,具体地,参照图4,该算子包括重组算子(Project)、截断算子(Limit)、循环算子(Loop)、过滤算子(Filter)、索引扫描算子(IndexScan)和邻点获取算子(GetNeighbors),在图4所示的执行计划中,重组算子(Project)会使用截断算子(Limit)输出的变量结果(变量结果为变量值),截断算子(Limit)会使用过滤算子(Filter)输出的变量结果,过滤算子(Filter)使用重组算子(Project)的变量结果,重组算子(Project)使用邻点获取算子(GetNeighbors)的变量结果,邻点获取算子(GetNeighbors)使用索引扫描算子(IndexScan)的变量结果;所以我们分析的时候从重组算子(Project)开始遍历,检查到重组算子(Project)使用截断算子(Limit)的输出结果,并且截断算子(Limit)输出的结果还没有设置最终使用者,所以把重组算子(Project)设置为截断算子(Limit)输出结果的最终使用者;依次类推,逐步遍历整个执行计划得出所有输出结果的最终使用者。在执行的时候,比如说执行完重组算子(Project)后,检查到重组算子(Project)是截断算子(Limit)输出结果的最终使用者,也就是说重组算子(Project)执行完成后,没有其他算子会再使用截断算子(Limit)的输出结果,所以可以释放掉截断算子(Limit)输出结果占据的内存,减少无效的内存占用。

图5是根据本申请实施例的基于静态分析的图数据库内存管理系统的结构框图,如图5所示,本申请还提出一种基于静态分析的图数据库内存管理系统,该系统包括:

生成模块51,用于根据语法树成所述图数据库的执行计划,并在生成所述执行计划时注册映射表;其中,映射表用于存储变量及相应的变量值,且执行计划包括多个算子;

分析模块52,在执行当前输入变量的算子之前,用于根据先序遍历分析所述当前输入变量的算子是否为最终使用者,并输出相应的分析结果;

管理模块53,在执行完所述当前输入变量的算子之后,用于根据所述分析结果释放所述输入变量对应的变量值或将所述变量值存储至所述映射表。

需要说明的是,由于本基于静态分析的图数据库内存管理系统采用了上述所有实施例的全部技术方案,因此至少具有上述实施例的技术方案所带来的所有有益效果,在此不再一一赘。

本申请还提供了一种电子设备,包括存储器和处理器,该存储器中存储有计算机程序,处理器被设置为运行计算机程序以执行上述的基于静态分析的图数据库内存管理方法。

可选地,上述电子设备还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。

可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:

步骤S101,通过语法树生成图数据库的执行计划,并在生成所述执行计划时注册映射表,所述映射表用于存储变量及相应的变量值,且所述执行计划包括多个算子;

步骤S102,通过先序遍历找出各个变量的最终使用者;

步骤S103,在执行所述执行计划的过程中,若当前算子为输入的变量的最终使用者,则执行完所述当前算子后,释放所述输入的变量对应的变量值,其中,当前输入的变量的算子称为当前算子。

需要说明的是,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。

另外,结合上述实施例中的基于静态分析的图数据库内存管理方法,本申请实施例可提供一种存储介质来实现。该存储介质上存储有计算机程序;该计算机程序被处理器执行时实现上述实施例中的任意一种基于静态分析的图数据库内存管理方法。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种基于静态分析的图数据库内存管理方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

在一个实施例中,图6是根据本申请实施例的电子设备的内部结构示意图,如图6所示,提供了一种电子设备,该电子设备可以是服务器,其内部结构图可以如图5所示。该电子设备包括通过内部总线连接的处理器、网络接口、内存储器和非易失性存储器,其中,该非易失性存储器存储有操作系统、计算机程序和数据库。处理器用于提供计算和控制能力,网络接口用于与外部的终端通过网络连接通信,内存储器用于为操作系统和计算机程序的运行提供环境,计算机程序被处理器执行时以实现一种基于静态分析的图数据库内存管理方法,数据库用于存储数据。

本领域技术人员可以理解,图6中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的电子设备的限定,具体的电子设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

本领域的技术人员应该明白,以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

完整详细技术资料下载
上一篇:石墨接头机器人自动装卡簧、装栓机
下一篇:基于语义的透视图像检索方法及其装置

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!