一种图数据结构的内存优化方法、系统和介质转让专利

申请号 : CN202211654553.X

文献号 : CN115658329B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 伊兴路姬明泉侯凤林叶小萌

申请人 : 杭州欧若数网科技有限公司

摘要 :

本申请涉及一种图数据结构的内存优化方法、系统和介质,其中,该方法包括:通过抽象得到内存数据结构;在图数据库执行计算任务的过程中,基于内存数据结构进行内存写入和内存释放,其中,内存写入包括:判断要获取的图数据的类型,若图数据的类型为基础数据类型,则直接复制图数据并写入内存中,若图数据的类型为复杂数据类型,则只复制图数据的指针地址,不复制指针地址所指向的数据值,将复制到的指针地址写入内存中,通过本申请,解决了如何优化图数据库在进行计算过程中的内存占用问题,实现了通过构造内存数据结构进行内存写入和释放,在不降低性能开销和无需大量修改的前提下,显著降低内存占用,提高了图数据库的查询性能和稳定性。

权利要求 :

1.一种图数据结构的内存优化方法,其特征在于,所述方法包括:抽象得到内存数据结构,所述内存数据结构包含类型字段和数值字段,用于统一标识不同的图数据类型;其中,所述图数据类型包括基础数据类型和复杂数据类型,基础数据类型的数值字段中存储着图数据的数据值,复杂数据类型的数值字段中存储着指向数据值的指针地址;

在图数据库执行计算任务的过程中,基于所述内存数据结构进行内存写入和内存释放,其中,所述内存写入包括:判断要获取的图数据的类型;

若所述图数据的类型为基础数据类型,则直接复制所述图数据并写入内存中;

若所述图数据的类型为复杂数据类型,则只复制所述图数据的指针地址,不复制所述指针地址所指向的数据值,将复制到的指针地址写入内存中。

2.根据权利要求1所述的方法,其特征在于,基于所述内存数据结构进行内存写入包括:基于所述类型字段判断要获取的图数据的类型;

若所述图数据的类型为基础数据类型,则直接复制对应数值字段中的数据值并写入内存中;

若所述图数据的类型为复杂数据类型,则只复制对应数值字段中的指针地址,不复制所述指针地址所指向的数据值,将复制到的指针地址写入内存中。

3.根据权利要求1所述的方法,其特征在于,在抽象得到内存数据结构之后,所述方法包括:对于复杂数据类型的图数据,在复杂数据类型的内存数据结构中引入引用计数。

4.根据权利要求3所述的方法,其特征在于,基于所述内存数据结构进行内存释放包括:基于类型字段判断要释放的图数据的类型;

若所述图数据的类型为基础数据类型,则在内存中直接删除对应数值字段的数据值;

若所述图数据的类型为复杂数据类型,则根据所述引用计数释放所述复杂数据类型的图数据所占用的内存。

5.根据权利要求3所述的方法,其特征在于,对于复杂数据类型的图数据,在复杂数据类型的内存数据结构中引入引用计数包括:对于复杂数据类型的图数据,复用内存数据结构中的类型字段,创建用于存储引用计数的字节空间。

6.根据权利要求3所述的方法,其特征在于,对于复杂数据类型的图数据,在复杂数据类型的内存数据结构中引入引用计数还包括:对于复杂数据类型的图数据,更改复杂数据类型的内存数据结构,往所述内存数据结构中新添加引用计数成员。

7.根据权利要求4所述的方法,其特征在于,根据所述引用计数释放所述复杂数据类型的图数据所占用的内存包括:判断当前内存释放后,所述引用计数的数值是否为零;

若是,则在内存中删除所述引用计数,删除指针地址所指向的数据值,删除所述指针地址;

若否,则更新降低所述引用计数的数值。

8.一种图数据结构的内存优化系统,其特征在于,所述系统包括数据结构构造模块和任务执行模块;

所述数据结构构造模块,用于抽象得到内存数据结构,所述内存数据结构包含类型字段和数值字段,用于统一标识不同的图数据类型;其中,所述图数据类型包括基础数据类型和复杂数据类型,基础数据类型的数值字段中存储着图数据的数据值,复杂数据类型的数值字段中存储着指向数据值的指针地址;

所述任务执行模块,用于在图数据库执行计算任务的过程中,基于所述内存数据结构进行内存写入和内存释放;所述内存写入包括:判断要获取的图数据的类型;若所述图数据的类型为基础数据类型,则直接复制所述图数据并写入内存中;若所述图数据的类型为复杂数据类型,则只复制所述图数据的指针地址,不复制所述指针地址所指向的数据值,将复制到的指针地址写入内存中。

9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至7中任一项所述的方法。

说明书 :

一种图数据结构的内存优化方法、系统和介质

技术领域

[0001] 本申请涉及图数据库领域,特别是涉及一种图数据结构的内存优化方法、系统和介质。

背景技术

[0002] 随着计算机技术的不断发展,图数据库正在被社交网络、知识图谱、金融风控等越来越多领域的企业所使用。
[0003] 对于现有的图数据库而言,图数据库在查询计算时使用到的图数据主要包括点数据、边数据和路径数据,其中,路径数据是点数据‑边数据‑点数据依次交替排列而成的数据,相较于关系数据库中二维表格类型的数据,图数据的数据结构更为复杂,若是在图数据的查询计算过程中依然像关系数据库一样进行逐行计算,会存在着数据量急剧扩张的风险,容易导致产生内存溢出的错误,进而影响线上的业务服务。
[0004] 目前针对相关技术中如何优化图数据库在进行计算过程中的内存占用的问题,尚未提出有效的解决方案。

发明内容

[0005] 本申请实施例提供了一种图数据结构的内存优化方法、系统和介质,以至少解决相关技术中如何优化图数据库在进行计算过程中的内存占用的问题。
[0006] 第一方面,本申请实施例提供了一种图数据结构的内存优化方法,所述方法包括:
[0007] 抽象得到内存数据结构,用于统一标识不同的图数据类型;其中,所述图数据类型包括基础数据类型和复杂数据类型;
[0008] 在图数据库执行计算任务的过程中,基于所述内存数据结构进行内存写入和内存释放,其中,所述内存写入包括:判断要获取的图数据的类型;
[0009] 若所述图数据的类型为基础数据类型,则直接复制所述图数据并写入内存中;
[0010] 若所述图数据的类型为复杂数据类型,则只复制所述图数据的指针地址,不复制所述指针地址所指向的数据值,将复制到的指针地址写入内存中。
[0011] 在其中一些实施例中,抽象得到内存数据结构包括:
[0012] 抽象得到内存数据结构,所述内存数据结构包含类型字段和数值字段,基础数据类型的数值字段中存储着图数据的数据值,复杂数据类型的数值字段中存储着指向数据值的指针地址。
[0013] 在其中一些实施例中,所述基于所述内存数据结构进行内存写入包括:
[0014] 基于所述类型字段判断要获取的图数据的类型;
[0015] 若所述图数据的类型为基础数据类型,则直接复制对应数值字段中的数据值并写入内存中;
[0016] 若所述图数据的类型为复杂数据类型,则只复制对应数值字段中的指针地址,不复制所述指针地址所指向的数据值,将复制到的指针地址写入内存中。
[0017] 在其中一些实施例中,在抽象得到内存数据结构之后,所述方法包括:
[0018] 对于复杂数据类型的图数据,在复杂数据类型的内存数据结构中引入引用计数。
[0019] 在其中一些实施例中,基于所述内存数据结构进行内存释放包括:
[0020] 基于所述类型字段判断要释放的图数据的类型;
[0021] 若所述图数据的类型为基础数据类型,则在内存中直接删除对应数值字段的数据值;
[0022] 若所述图数据的类型为复杂数据类型,则根据所述引用计数释放所述复杂数据类型的图数据所占用的内存。
[0023] 在其中一些实施例中,对于复杂数据类型的图数据,在复杂数据类型的内存数据结构中引入引用计数包括:
[0024] 对于复杂数据类型的图数据,复用内存数据结构中的类型字段,创建用于存储引用计数的字节空间。
[0025] 在其中一些实施例中,对于复杂数据类型的图数据,在复杂数据类型的内存数据结构中引入引用计数还包括:
[0026] 对于复杂数据类型的图数据,更改复杂数据类型的内存数据结构,往所述内存数据结构中新添加引用计数成员。
[0027] 在其中一些实施例中,根据所述引用计数释放所述复杂数据类型的图数据所占用的内存包括:
[0028] 判断当前内存释放后,所述引用计数的数值是否为零;
[0029] 若是,则在内存中删除所述引用计数,删除指针地址所指向的数据值,删除所述指针地址;
[0030] 若否,则更新降低所述引用计数的数值。
[0031] 第二方面,本申请实施例提供了一种图数据结构的内存优化系统,所述系统包括数据结构构造模块和任务执行模块;
[0032] 所述数据结构构造模块,用于抽象得到内存数据结构,用于统一标识不同的图数据类型;其中,所述图数据类型包括基础数据类型和复杂数据类型;
[0033] 所述任务执行模块,用于在图数据库执行计算任务的过程中,基于所述内存数据结构进行内存写入和内存释放;所述内存写入包括:判断要获取的图数据的类型;若所述图数据的类型为基础数据类型,则直接复制所述图数据并写入内存中;若所述图数据的类型为复杂数据类型,则只复制所述图数据的指针地址,不复制所述指针地址所指向的数据值,将复制到的指针地址写入内存中。
[0034] 第三方面,本申请实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如上述第一方面所述的方法。
[0035] 相比于相关技术,本申请实施例提供的一种图数据结构的内存优化方法、系统和介质,该方法通过抽象得到内存数据结构,图数据类型包括基础数据类型和复杂数据类型;在图数据库执行计算任务的过程中,基于内存数据结构进行内存写入和内存释放,其中,内存写入包括:判断要获取的图数据的类型,若图数据的类型为基础数据类型,则直接复制图数据并写入内存中,若图数据的类型为复杂数据类型,则只复制图数据的指针地址,不复制指针地址所指向的数据值,将复制到的指针地址写入内存中,解决了如何优化图数据库在进行计算过程中的内存占用问题,实现了通过构造内存数据结构进行内存写入和释放,在不降低性能开销和无需大量修改的前提下,显著降低内存占用,提高了图数据库的查询性能和稳定性。

附图说明

[0036] 此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
[0037] 图1是根据本申请实施例的图数据结构的内存优化方法的步骤流程图;
[0038] 图2是根据本申请实施例的基础数据类型对应内存数据结构的示意图;
[0039] 图3是根据本申请实施例的复杂数据类型对应内存数据结构的示意图;
[0040] 图4是根据本申请实施例的实现复杂数据类型复用内存的示意图;
[0041] 图5是根据本申请实施例的基于内存数据结构进行内存释放的步骤流程图;
[0042] 图6是根据本申请实施例的引入引用计数的示意图一;
[0043] 图7是根据本申请实施例的引入引用计数的示意图二;
[0044] 图8是根据本申请实施例的图数据结构的内存优化系统的结构框图;
[0045] 图9是根据本申请实施例的电子设备的内部结构示意图。
[0046] 附图标记:81、数据结构构造模块;82、任务执行模块。

具体实施方式

[0047] 为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行描述和说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。基于本申请提供的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0048] 显而易见地,下面描述中的附图仅仅是本申请的一些示例或实施例,对于本领域的普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图将本申请应用于其他类似情景。此外,还可以理解的是,虽然这种开发过程中所作出的努力可能是复杂并且冗长的,然而对于与本申请公开的内容相关的本领域的普通技术人员而言,在本申请揭露的技术内容的基础上进行的一些设计,制造或者生产等变更只是常规的技术手段,不应当理解为本申请公开的内容不充分。
[0049] 在本申请中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域普通技术人员显式地和隐式地理解的是,本申请所描述的实施例在不冲突的情况下,可以与其它实施例相结合。
[0050] 除非另作定义,本申请所涉及的技术术语或者科学术语应当为本申请所属技术领域内具有一般技能的人士所理解的通常意义。本申请所涉及的“一”、“一个”、“一种”、“该”等类似词语并不表示数量限制,可表示单数或复数。本申请所涉及的术语“包括”、“包含”、“具有”以及它们任何变形,意图在于覆盖不排他的包含;例如包含了一系列步骤或模块(单元)的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可以还包括没有列出的步骤或单元,或可以还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。本申请所涉及的“连接”、“相连”、“耦接”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电气的连接,不管是直接的还是间接的。本申请所涉及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,“A和/或B”可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。本申请所涉及的术语“第一”、“第二”、“第三”等仅仅是区别类似的对象,不代表针对对象的特定排序。
[0051] 本申请实施例提供了一种图数据结构的内存优化方法,图1是根据本申请实施例的图数据结构的内存优化方法的步骤流程图,如图1所示,该方法包括以下步骤:
[0052] 步骤S102,抽象得到内存数据结构,用于统一标识不同的图数据类型;其中,图数据类型包括基础数据类型和复杂数据类型;
[0053] 具体地,为了在能在图数据库(如NebulaGraph)的计算过程中能够提供统一的计算模型,抽象了内存数据结构(Value)来统一标识不同的数据类型,其中由类型字段(Value::type_)来表示具体是哪种数据类型。在每次的表达式计算过程中会根据这个type类型来获取对应的数据进行求值。内存数据结构(Value)的具体代码定义如下:
[0054] struct Value {
[0055]   enum class Type : uint64_t {
[0056]     __EMPTY__ = 1UL,
[0057]     BOOL = 1UL << 1,
[0058]     INT = 1UL << 2,
[0059]     FLOAT = 1UL << 3,
[0060]     STRING = 1UL << 4,
[0061]     DATE = 1UL << 5,
[0062]     TIME = 1UL << 6,
[0063]     DATETIME = 1UL << 7,
[0064]     VERTEX = 1UL << 8,
[0065]     EDGE = 1UL << 9,
[0066]     PATH = 1UL << 10,
[0067]     LIST = 1UL << 11,
[0068]     MAP = 1UL << 12,
[0069]     SET = 1UL << 13,
[0070]     DATASET = 1UL << 14,
[0071]     GEOGRAPHY = 1UL << 15,
[0072]     DURATION = 1UL << 16,
[0073]     NULLVALUE = 1UL << 63,
[0074]   };
[0075]   Type type_;
[0076]   union Storage {
[0077]     NullType nVal;
[0078]     bool bVal;
[0079]     int64_t iVal;
[0080]     double fVal;
[0081]     std::unique_ptr sVal;
[0082]     Date dVal;
[0083]     Time tVal;
[0084]     DateTime dtVal;
[0085]     std::unique_ptr vVal;
[0086]     std::unique_ptr eVal;
[0087]     std::unique_ptr pVal;
[0088]     std::unique_ptr lVal;
[0089]     std::unique_ptr mVal;
[0090]     std::unique_ptr uVal;
[0091]     std::unique_ptr gVal;
[0092]     std::unique_ptr ggVal;
[0093]     std::unique_ptr duVal;
[0094]   } value_;
[0095] };
[0096] 由上述Value的代码定义可知,每个Value由类型字段(Value::type_)和数值字段(Value::value_)总共16个字节(各8个字节)组成。图2是根据本申请实施例的基础数据类型对应内存数据结构的示意图,如图2所示,对于基础数据类型(如bool、int64_t、double、Date、Time、DateTime等),对应图数据的数据值直接存储在数值字段(Value::value_)上,不再额外占用外部的空间;图3是根据本申请实施例的复杂数据类型对应内存数据结构的示意图,如图3所示,而对于复杂数据类型(如Vertex、Edge、Path、List、Map、Geography等),数值字段(Value::value_)上只是存储的一个指针的内存地址(图3中的0x7defab3c为指针的具体内存地址),具体的数据值存储在外部的内存空间。
[0097] 需要说明的是,以复杂数据类型Vertex为例,Vertex类型的Value::value_仅存储指向具体数据值的指针地址,而具体数据值都存储在外部内存空间,且该具体数据值由基础数据类型的Value::value_管理,由此可见,若在图数据库的路径查询计算中,查询得到的Vertex结果集合为:结果1(v1‑>v2‑>v4‑>v5)、结果2(v1‑>v2‑>v4‑>v6)和结果3(v1‑>v2‑>v5‑>v6),结果1、2和3中存在着大量重复的Vertex,因此,对于上述重复Vertex,当Vertex的Value发生复制写入内存时,Value::value_ 指向的具体数据值也会发生复制并写入内存,如此一来,势必会造成数据的大量冗余,产生较大的内存占用甚至内存溢出。
[0098] 在此基础上,如果能在复杂数据类型的Value发生复制写入内存时,只复制 Value本身而不再复制Value::value_指向的数据值,那么对于复杂数据类型就能实现复用内存,图4是根据本申请实施例的实现复杂数据类型复用内存的示意图,如图4所示,图4中的0x7defab3c为指针的具体内存地址,复杂数据类型的内存数据结构2与内存数据结构1相同,两者指向的具体数据内存是同一处,具体地方法步骤描述可见以下步骤S104至步骤S108,优化图数据库在进行计算过程中的内存占用,降低内存占用,提高图数据库的查询性能和稳定性。
[0099] 步骤S104,在图数据库执行计算任务的过程中,基于内存数据结构进行内存写入,判断要获取的图数据的类型;
[0100] 具体地,基于内存数据结构(Value)的类型字段(Value::type_)判断要获取的图数据的类型。
[0101] 步骤S106,若图数据的类型为基础数据类型,则直接复制图数据并写入内存中;
[0102] 具体地,若图数据的类型为基础数据类型,则直接复制对应数值字段(Value::value_)中的数据值并写入内存中;
[0103] 步骤S108,若图数据的类型为复杂数据类型,则只复制图数据的指针地址,不复制指针地址所指向的数据值,将复制到的指针地址写入内存中。
[0104] 具体地,若图数据的类型为复杂数据类型,则只复制对应数值字段(Value::value_)中的指针地址,不复制指针地址所指向的数据值,将复制到的指针地址写入内存中。
[0105] 在其中一些申请实施例中,图5是根据本申请实施例的基于内存数据结构进行内存释放的步骤流程图,如图5所示,在上述步骤S102抽象得到内存数据结构之后,还包括以下步骤:
[0106] 步骤S502,对于复杂数据类型的图数据,在复杂数据类型的内存数据结构(Value)中引入引用计数。
[0107] 步骤S504,在图数据库执行计算任务的过程中,基于内存数据结构(Value)的类型字段(Value::type_)判断要释放的图数据的类型。
[0108] 步骤S506,若图数据的类型为基础数据类型,则在内存中直接删除对应数值字段(Value::value_)的数据值;
[0109] 步骤S508,若图数据的类型为复杂数据类型,则根据引用计数释放复杂数据类型的图数据所占用的内存。
[0110] 具体地,判断当前内存释放后,引用计数的数值是否为零;若是,则在内存中删除引用计数,删除指针地址所指向的数据值,删除指针地址;若否,则更新降低引用计数的数值。
[0111] 在其中一些实施例中,步骤S502具体地,对于复杂数据类型的图数据,复用内存数据结构中的类型字段,创建用于存储引用计数的字节空间。
[0112] 优选地,无论在x64还是ARM架构的服务器上,指针的地址空间使用6个字节(48bits)即可表示内存的具体地址。进一步观察到内存数据结构(Value)的类型字段(Value::type_)占用了8个字节,而具体的Value type类型只有不到20种,那么重新定义Value::type_值的范围便可腾出6个字节来存放一个内存地址空间作为引用计数的字节空间。对于复杂数据类型的数据而言,Value中在不增加额外内存的情况下拥有了存储引用计数内存的空间。将Value::type_从原来按位运算的取值定义为按顺序增加的取值,具体代码实现如下:
[0113]  enum class Type : uint64_t {
[0114]   __EMPTY__ = 0,
[0115]   BOOL = 1,
[0116]   INT = 2,
[0117]   FLOAT = 3,
[0118]   STRING = 4,
[0119]   DATE = 5,
[0120]   TIME = 6,
[0121]   DATETIME = 7,
[0122]   VERTEX = 8,
[0123]   EDGE = 9,
[0124]   PATH = 10,
[0125]   LIST = 11,
[0126]   MAP = 12,
[0127]   SET = 13,
[0128]   DATASET = 14,
[0129]   GEOGRAPHY = 15,
[0130]   DURATION = 16,
[0131]   NULLVALUE = 63,
[0132] };
[0133] 图6是根据本申请实施例的引入引用计数的示意图一,如图6所示,通过复用Value::type_的字节空间,为复杂数据类型引入了引用计数的功能,这样在value的复制时可以节省大量的重复数据的内存,尤其对于路径相关的查询,效果更加显著。同时这种方式没有改变两种数据类型的数据访问性能和NebulaGraph查询层的已有逻辑以及跟Value相关的上下游的实现(RPC/Expression等),可以做到较小投入较高收益,需要注意的是,图6中的0x7defab3c为指针的具体内存地址。
[0134] 需要补充的是,在通过复用Value::type_的字节空间,为复杂数据类型引入引用计数的基础上,上述步骤S106至步骤S108的伪代码逻辑如下:
[0135] if 传入数据为基础数据类型:
[0136]   使用 Value 的已有逻辑;
[0137] else:
[0138]   设置 Value::type_ 等于具体的数据类型取值;
[0139]   申请一个引用计数的额外内存(refCntAddr = new int(1));
[0140]   设置 refCntAddr 值到 Value::type_ & 0xFFFFFFFFFFFF0000 的 bits 中;
[0141]   复用 Value 中 value_ 设置的逻辑;
[0142] 对于 Value 的复制的逻辑就只是更新引用计数即可:
[0143] if Value::type_ & 0xFF 是基础数据类型:
[0144]   返回 Value 的值;
[0145] else:
[0146]   refCntAddr = Value::type_ >> 16;
[0147]   ++(*refCntAddr);
[0148]   value_ 中的 unique_ptr 只设置一下原来 value_.get() 的值,并不再重新申请内存;
[0149] 上述步骤S506至步骤S508的伪代码逻辑如下:
[0150] 对于 Value 的删除逻辑就是降低引用计数同时判断是否真正的释放内存即可:
[0151] if Value::type_ & 0xFF 是基础数据类型:
[0152]   直接删除 Value 的内存;
[0153] else:
[0154]   refCntAddr = Value::type_ >> 16;
[0155]   if (‑‑(*refCntAddr) == 0):
[0156]     删除 value_ 指向的内存 unique_ptr::reset(),refCntAddr 指向的内存,同时删除 Value 的内存
[0157]   else:
[0158]     释放 value_ 的 unique_ptr 的所有权:unique_ptr::release()
[0159] 在其中一些实施例中,步骤S502具体地,对于复杂数据类型的图数据,更改复杂数据类型的内存数据结构,往内存数据结构中新添加引用计数成员。
[0160] 优选地,上述“复用Value::type_的字节空间,为复杂数据类型引入引用计数”的缺点是在额外申请了一块内存空间,NebulaGraph 虽然使用了内存池的三方库,但依然有可能导致RefCnt的内存和Value::value_指向的内存不能连续存放,而且会额外引入内存申请(malloc) 和释放(free)开销,在复杂数据类型的数据量级较大时,存在一定的性能开销。为了减少这块的开销,考虑将 RefCnt 跟具体数据值组合在一个结构中。比如以Vertex类型为例,具体的代码实现如下:
[0161] struct Value {
[0162]   Type type_;
[0163]   union {
[0164]     std::unique_ptr sVal;
[0165]     std::unique_ptr vVal;
[0166]     // ...
[0167]   } value_;
[0168] };
[0169] struct Vertex {
[0170]   int refCnt; // <‑ New Field: reference count
[0171]   string name;
[0172]   vector tags;
[0173] };
[0174] 图7是根据本申请实施例的引入引用计数的示意图二,如图7所示,除了Vertex 类型,其他复杂数据类型都可以采用类似上述的处理方式,如此即可通过一次内存申请为为复杂数据类型引入引用计数,若考虑到数据结构的内存对齐等因素,在一些复杂数据结构中,虽然增加了refCnt 字段,但是该字段可能不占用额外的空间,需要注意的是,图7中的0x7defab3c为指针的具体内存地址。
[0175] 需要说明的是,在上述流程中或者附图的流程图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
[0176] 本申请实施例提供了一种图数据结构的内存优化系统,图8是根据本申请实施例的图数据结构的内存优化系统的结构框图,如图8所示,该系统包括数据结构构造模块81和任务执行模块82;
[0177] 数据结构构造模块81,用于抽象得到内存数据结构,用于统一标识不同的图数据类型;其中,图数据类型包括基础数据类型和复杂数据类型;
[0178] 任务执行模块82,用于在图数据库执行计算任务的过程中,基于内存数据结构进行内存写入和内存释放;内存写入包括:判断要获取的图数据的类型;若图数据的类型为基础数据类型,则直接复制图数据并写入内存中;若图数据的类型为复杂数据类型,则只复制图数据的指针地址,不复制指针地址所指向的数据值,将复制到的指针地址写入内存中。
[0179] 通过本申请实施例中的数据结构构造模块81和任务执行模块82,解决了如何优化图数据库在进行计算过程中的内存占用问题,实现了通过构造内存数据结构进行内存写入和释放,在不降低性能开销和无需大量修改的前提下,显著降低内存占用,提高了图数据库的查询性能和稳定性。
[0180] 需要说明的是,上述各个模块可以是功能模块也可以是程序模块,既可以通过软件来实现,也可以通过硬件来实现。对于通过硬件来实现的模块而言,上述各个模块可以位于同一处理器中;或者上述各个模块还可以按照任意组合的形式分别位于不同的处理器中。
[0181] 本实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步骤。
[0182] 可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
[0183] 需要说明的是,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
[0184] 另外,结合上述实施例中的图数据结构的内存优化方法,本申请实施例可提供一种存储介质来实现。该存储介质上存储有计算机程序;该计算机程序被处理器执行时实现上述实施例中的任意一种图数据结构的内存优化方法。
[0185] 在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种图数据结构的内存优化方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
[0186] 在一个实施例中,图9是根据本申请实施例的电子设备的内部结构示意图,如图9所示,提供了一种电子设备,该电子设备可以是服务器,其内部结构图可以如图9所示。该电子设备包括通过内部总线连接的处理器、网络接口、内存储器和非易失性存储器,其中,该非易失性存储器存储有操作系统、计算机程序和数据库。处理器用于提供计算和控制能力,网络接口用于与外部的终端通过网络连接通信,内存储器用于为操作系统和计算机程序的运行提供环境,计算机程序被处理器执行时以实现一种图数据结构的内存优化方法,数据库用于存储数据。
[0187] 本领域技术人员可以理解,图9中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的电子设备的限定,具体的电子设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0188] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
[0189] 本领域的技术人员应该明白,以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0190] 以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。