首页 > 其他分享 >CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新

CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新

时间:2023-06-20 15:01:12浏览次数:50  
标签:GES 快照 HyG 更新 values 数组 格式 CSR

摘要:HyG图计算引擎采用CSR格式来存储图的拓扑信息,CSR格式可以将稀疏矩阵的存储空间压缩,进而大大降低图的存储开销,同时具备访问效率高、格式易转化等优点。

本文分享自华为云社区《CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新》,作者: π 。

HyG图计算引擎采用CSR格式来存储图的拓扑信息,CSR格式可以将稀疏矩阵的存储空间压缩,进而大大降低图的存储开销,同时具备访问效率高、格式易转化等优点。利用CSR + 列存(parquet格式)的组合,HyG获得了很高的图访问性能。但是,对于数据需要增量更新的场景,CSR的更新非常困难,可能会导致大量的数据复制和移动,进而影响系统性能。HyG对传统CSR更新进行了一系列优化,实现了高效的数据更新。

什么是CSR格式?

CSR格式是一种常用的稀疏矩阵存储格式,它将稀疏矩阵以三个数组的形式存储。具体来说,CSR格式使用 values、column indices和row offsets三个数组来表示稀疏矩阵。

CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新_迭代器

定义NNZ(Num-non-zero)为矩阵M中非0元素的个数。

第一个数组为values数组。其中,values数组的长度为NNZ,分别从左到右从上到下的非零元素的值。

第二个数组为column数组。其中,column数组的长度为NNZ,其对应于values数组中的元素的column_index(例如元素8排列在所在行的第3个位置,因此其column index为2)。

第三个数组为row offsets,其中row offsets的数组大小为m+1,其前m个元素分别代表这每一行中第一个非零元素在Values数组的下标。(例如元素2是第二行的第二个元素,其在values数组中的下标为2.)。

CSC和CSR类似,只不过和CSR行列互换。values数组里是按列存的数值,row offsets变成了col offsets,column数组变成了row数组。

CSR格式由于其紧凑的存储方式和高效的计算方式,已经成为了处理稀疏矩阵的标准格式之一。具体来说,CSR格式可以利用连续的内存块来存储非零元素,这使得计算机在处理稀疏矩阵时可以跳过大量的零元素,从而提高了计算效率。此外,CSR格式所需要的存储空间相对于其他格式,如COO格式(Coordinate)等,也更为紧凑,这在处理大型稀疏矩阵时非常有利。

如何更新CSR格式数据?

传统方案:

更新图数据需要对三个数组进行操作:values、columns和row offset。

更新

要更新矩阵中某个位置(i,j)的值,需要找到该位置在CSR格式中对应的行(第i行)在values和columns数组中的起始和结束索引。具体而言,该行的非零元素在values数组中的起始位置是row offset [i],结束位置是row offset [i+1]-1。然后,在columns数组中找到对应的列(第j列)的索引位置。

接下来,可以直接更新values数组中对应位置的值,即values[row offset[i]+k],其中k是columns数组中第j列的索引位置。

插入

如果要插入一个新的非零元素,可以按照以下步骤进行:

1、找到要插入的元素在CSR格式中对应的行(第i行)在values和columns数组中的起始和结束索引,方法同上。

2、在columns数组中找到新元素应该插入的位置,即找到插入元素后columns数组中第j列的索引位置。

3、将新元素的值插入到values数组中正确的位置,并将columns数组中对应位置以及后面的元素向后移动一个位置。

4、更新row offset数组中第i行及其后面所有行的元素起始位置,因为在第i行插入了一个新的非零元素。

删除

如果要删除一个非零元素,可以按照以下步骤进行:

1、找到要删除的元素在CSR格式中对应的行(第i行)在values和columns数组中的起始和结束索引,方法同上。

2、在columns数组中找到要删除的元素的位置。

3、从values和columns数组中删除该元素,并将后面的元素向前移动一个位置。

4、更新row offset数组中第i行及其后面所有行的元素起始位置,因为在第i行删除了一个非零元素。

需要注意的是,更新CSR格式中的元素可能会导致数组长度的变化,因此需要动态分配和释放内存空间。此外,在进行插入和删除操作时,可能需要对row offset数组中的元素进行更新,这可能会影响CSR格式的性能。

总之,CSR格式的更新操作相对复杂,需要对三个数组进行操作,并需要考虑内存分配和数组长度的变化等问题,这十分不利于实时分批式的增量更新。

HyG数据更新策略

  • 每次更新都会生成一个子图(delta_graph),这个子图是CSR格式,描述了增量信息。
  • 引入deleted_biset数组,记录被删除的点、边信息。
  • 按顺序加载 MergedPG = pg + [delta_graph]
  • 对各点、边按照所属的pg/ delta_graph进行本地访问和增、删。

因为HyG考虑了分布式切分图的场景,我们将场景简化,接下来描述一下数据更新的流程。

图原始数据如下图所示,图中包含4个点,4条边,4条边上的值分别为1、7、2、8。

CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新_数组_02

图对应的CSR格式如下图所示,这个是原始的拓扑数据。

CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新_稀疏矩阵_03

我们对数据进行更新,基于原始图新增了边0(src)->3(dst),边的值为3。删除了边1(src)->2(dst),边的值为8。

CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新_数组_04

新增了1条边,边的src是0,dst是3,因此CSR的row offset为[1 1 1 1],column为[3],value为[3]。进而得到了右侧的delta graph。

删除了1条边,这条边是属于pg(原始图),所以,我们会对pg的deleted_bitset置位,因为删除是column数组的最后一个,因此,我们会将最后一个bit置为1,表示这个边已被删除。

到此,我们就完成了一次增、删操作,生成了一个新的delta graph,这个delta graph跟历史数据没有任何关系,它只表示了本次增量的数据,因此,对于超大规模的图,更新数据不再需要大量的数据拷贝和移动,只需要生成一个很小的delta graph就可以了。

CSR格式如何更新? GES图计算引擎HyG揭秘之数据更新_CSR格式_05

图访问

经过增量更新,全量图的信息就会被分解为一个原始图和一个增量图。HyG设计了一种同时读取到两个图信息的访问迭代器(以下简称“二级迭代器”),这种迭代器会将这多个子图视为一个全量图访问,可以在不同的子图间游走。

HyG增量图迭代性能优化

HyG增量图会产生多个快照,每个快照是一个子图,对应着一次commit。算法读取增量图需要依赖HyG的二级迭代器,迭代器会在不同的快照间游走,校验点、边是否已被删除,最终返回给算法结果。因此,迭代器需要维护很多信息,远远大于pg(原始图)的轻量级迭代器,进而使增量图迭代的性能很低,快照数量越多性能下降越剧烈。

优化方案

HyG引入基于页的快照索引技术来缓解由于存在大量快照导致的性能下降问题。

为每个快照划分虚拟页,比如页的大小是4K,那么一个页对应着4K个点以及这4k点对应的边。

索引表记录了每个页最近被更新的快照,因此,如果这个页没有被更新,那么利用索引表可以直接跳过对应的快照。

索引表采用copy on write的方式更新,每生成一个新快照,会把上一个快照的全部索引信息copy一份,然后把修改信息更新到对应的索引上,得到最新快照的索引表。

同时,对于二级迭代器的构造,我们也进行了优化,尽量减少数据成员的数量,当迭代器在不同快照间切换时,去更新该快照的上下文信息,而不会维护所有快照的信息。

利用快照索引技术,我们可以快速的定位到点、边对应的最新修改的快照,进而可以跳过很多无效的访问。但是,随着快照数量的增多,图遍历的性能还是会不断下降,被删除的点、边不但浪费了大量的存储空间,还会增加无效的访问延时,因此,设计一套有效的自动化合并方案,当快照数量过多或者删除点、边过多时,触发合并,提升系统性能。如果大家感兴趣,我们后面会接着介绍HyG是如何实现快照合并的。


点击关注,第一时间了解华为云新鲜技术~

标签:GES,快照,HyG,更新,values,数组,格式,CSR
From: https://blog.51cto.com/u_15214399/6522828

相关文章

  • 如何更新或修改Git远程仓库的URL连接
    一、首先,确认你当前已经将本地项目与旧的远程仓库关联起来。运行以下命令查看当前的远程仓库配置: gitremote-v二、git上新创建的远程仓库名称记录下来三、接下来,使用以下命令来更新远程仓库的URL,将 <新的仓库URL> 替换为新的仓库URL,将 <远程仓库名称> 替换为你要更新的远......
  • react经典面试题解析--持续更新--day02
    二十一、高阶组件的使用场景1、数据获取:高阶组件可以在组件挂载时自动获取数据,并将数据通过props传递给被包装组件。2、权限控制:高阶组件可以检查用户是否有访问该组件的权限,从而决定是否渲染该组件。3、代码重用:高阶组件可以通过封装一些常见的逻辑,来提高代码的复用性。4、......
  • C++使用ranges库解析INI文件
    C++使用ranges库解析INI文件引言C++20引入了<ranges>头文件,C++23对其进行了完善,本文将使用该头文件提供的adaptor编写一个简单的ini解析器。ini文件格式介绍一般的ini文件由section和entry部分,比如[section]key=value;Thisisentry.section和entry均独占一行,其中sectio......
  • Windows下载更新powershell
    在使用windows系统默认的powershell时,打开使用的时候一般都会碰到以下这种情况,有新的版本可以尝试使用在powershell中使用命令:$PSVersionTable;可以查看到当前powershell的一些信息安装新版本powershellWindows官方powershell文档:https://aka.ms/pscore6Powershell7.1的官方Git......
  • css breakages 的概念介绍
    在前端开发中,CSS(层叠样式表)用于控制网页的样式和布局。如果在CSS代码中存在错误或不当的使用,可能会导致页面显示出不正确的样式或布局,这被称为CSSbreakages(CSS破坏)。CSSbreakages可以有多种形式,例如:语法错误:CSS代码中存在拼写错误、缺少或多余的符号、不正确的选择器或属性等......
  • 将docker里的所有images镜像推送至服务器上的harbor指定的仓库里
    使用shell脚本实现将docker里的所有images镜像推送至服务器上的harbor指定的仓库里shell脚本内容如下:#!/bin/bash#设置Harbor仓库的地址和凭据#harbor服务器地址HARBOR_URL="192.168.1.55:88"#用户名HARBOR_USERNAME="admin"#登录密码HARBOR_PASSWORD="Harbor12345"#指......
  • Android大厂面试题以及答案整理(2022年2月份更新),助你轻松拿下高薪offer
    前言想必现在有许多朋友,都在为即将到来的金三银四做准备,不知道各位朋友是否十足的把握能拿到自己心仪的Offer呢?下面无偿分享一份包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目,熟悉本文中列出的知识点会大大增加通过前两轮......
  • 外汇天眼:本周监管状态警告更新,以下平台快远离!
    监管信息早知道!外汇天眼将每周定期公布监管牌照状态发生变化的交易商,以供投资者参考,规避投资风险。以下是监管牌照发生变动的交易商平台,注意警惕!HengryHengry,对外宣称持有的澳大利亚ASIC普通工商注册牌照显示“疑似套牌”,暂时未查证到任何有效监管牌照,存在巨大风险!Hengry,天眼评分1.......
  • ChatGPT4+Midjourney镜像网站汇总-6月19日更新
    如何在国内使用ChatGPT4和Midjourney?本文将给出多个无需注册,无需登录,无需梯子,即可在国内使用ChatGPT的套壳网站,也称为镜像网站。......
  • JSP 最佳实践: 使用JSTL来更新JSP页面
    developerWorks中国  >  Javatechnology | Webdevelopment  >JSP最佳实践:使用JSTL来更新JSP页面http://www.ibm.com/developerworks/cn/java/j-jsp05273/index.html标准化JSTL标记为您的Web页面带来更多的功能级别:初级BrettMcLaughlin([email protected]),作者,......