一种面向大规模社交网络的图数据存储及查询方法_2

文档序号:8922524阅读:来源:国知局
果该边的时间戳位于该时间戳区间内,则扫描该内存块Block中的边,删除比该边的时间戳早的边。
[0021]进一步的,所述数据存储管理器将存储资源分成两类:粗粒度存储资源和细粒度存储资源,所述数据存储管理器的内存中设置有界缓存窗口 ;其中所述粗粒度存储资源用于存储设定的大文件,并常驻于内存,所述细粒度存储资源用于存储按需分配的小文件;所述数据存储管理器按需将细粒度存储资源载入该有界缓存窗口,当该有界缓存窗口被占满,需要加载新的细粒度存储资源时,采用缓存替换算法将该有界缓存窗口中已有的细粒度存储资源换出,然后载入新的细粒度存储资源。
[0022]进一步的,所述粗粒度存储资源和所述细粒度存储资源均划分成固定大小的所述内存块Block,每一内存块Block拥有唯一的Block ID。
[0023]进一步的,所述数据存储管理器首先分配粗粒度存储资源的内存块Block,当粗粒度存储资源耗尽时,开始按需地动态地分配细粒度存储资源在内存块Block。
[0024]如权利要求5所述的方法,其特征在于,所述数据存储器定期地扫描图数据,将过期的图数据从所述粗粒度存储资源中删除并转存到所述细粒度存储资源中。
[0025]一种图数据查询方法,其特征在于,当数据存储管理器收到访问顶点V的访问请求时,数据存储管理器将该顶点V及其k阶邻域传输给请求者;请求者将返回数据缓存在本地,下次查询时,首先检查本地的缓存,如果不存在查询的顶点,则将访问请求发送给所述数据存储管理器。
[0026]进一步的,所述顶点V的k阶邻域为从该顶点V出发经过最短距离k条边可达的全部顶点构成的集合。
[0027]与现有技术相比,本发明的积极效果为:
[0028](I)能满足动态更新。社交网络用户频繁产生数据,在实际应用中,数据分析对数据的时效性具有很高的要求,用户的行为产生的新数据需要不断的加入。
[0029](2)适合处理数据稀疏的场景。在社交网络中,用户的好友数目的差别很多,少数用户(如大V),拥有很多好友,而众多普通用户的好友数目稀少,从统计角度看,社交网络数据是平均出度很小的极度稀疏图。
[0030](3)适合随机访问。在访问图数据的过程中,不同于访问顺序数据集,一般先访问某个顶点,然后访问相邻顶点,再次访问相邻顶点的相邻顶点,如此不断地从一个顶点出发,由近及远,最后完成对整个图的遍历。
【附图说明】
[0031]图1本发明方法中的数据存储管理;
[0032]图2为顶点邻域的存储模型;
[0033]图3为本地写实验结果对比图;
[0034]图4为本地读实验结果对比图;
[0035]图5为实际数据和存储资源消耗对比图;
[0036]图6为远程写的实验结果对比图;
[0037]图7为远程读的实验结果对比图;
[0038]图8为数据更新的实验结果对比图;
[0039]图9远程预取和非预取的性能对比图。
【具体实施方式】
[0040]以下结合附图对本发明的原理和特征进行描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
[0041]本发明可以分为三部分:零移动的数据组织策略、自适应数据规模的存储管理策略以及应用感知的异地预取策略。
[0042]零移动的数据组织策略
[0043]图数据增量更新是指将产生的新边插入图中和从图中删除过时的旧边。将社交媒体用户的每时每刻的活动足迹产生新鲜图数据需要予以存储,而图数据中不再具有使用价值的过时图数据予以删除。
[0044]本文采用Key-Value存储,以顶点ID做Key,以顶点邻域做Value。顶点邻域的数据组织特点有:1)采用以时间戳将顶点相邻的边有序的存储到Block双向链表中,便于从链表的头部插入新边,从尾部删除旧边。2)为了降低边在双向链表的存储代价,将与顶点相连的多条边顺序存储在固定大小的内存块Block中,存储同一顶点的边的block块构成Block双向链表。Block由专门负责存储资源分配的Block池管理器负责分配回收。3)顶点邻域由数据结构Vertex和Block链表构成,其中Vertex是用户自定义的C语言的结构,其中包含了顶点的属性信息和指向Block双向链表头部和尾部的索引信息。
[0045]当向顶点邻域插入新边时,将新边按时间戳排序,先查看链表头部的Block是否未满,如果没有满,就追加在该Block的头部;如果头部的Block已满,且依然有待插入的新边,则由Block池管理器分配新的Block,添加到链表的头部,用待插入边填充新Block。重复该过程,直至更新完全部的新边。当删除顶点邻域中的老化边时,从Block双链表尾部的Block开始,为了快速的删除旧边,Block中有专门的数据域保存所存边的时间戳区间。如果想要删除的边的时间戳小于时间戳区间的下界,则结束删除操作;当待删边的时间戳大于时间戳区间的上界,则从链表末尾移除该Block,通过Block管理池回收已删除的Block ;如果当待删除边的时间戳出现在时间戳区间中,则扫描该Block中的边,删除比待删除边的时间戳老的边,并结束操作。
[0046]采用Block双向链表存储以时间戳有序的出边的方式组织顶点邻域,有诸多优点。第一,避免采用单条边存储的小额内存空间的频繁动态分配和存储过多额外的元数据。因为图数据的更新比较频繁,而每条边的数据量比较少,更新操作引起小额内存的频繁动态分配;并且边中的元数据相对于实际数据的比率也加大,导致内存内存的分配效率和利用率降低,而且单挑边的存储也不利于访问顶点邻域。第二,避免了采取顶点的全部出边整体存储的方式不利于图数据动态更新的问题,采用整体的存储,顶点的全部出边存储blob (动态分配的长度不固定的连续内存空间),新边插入操作会导致原存储空间耗尽,必须开辟足够大的新存储空间,挪动原来的数据,并插入新边。旧边删除到操作会导致存储空间空余数量可观的不可用的内部碎片。通常采用定期紧缩操作,数据移动重新整理图数据,以消除碎片。这种组织方式虽然访问顶点邻域具有很高的性能,但是紧缩操作会显著影响图数据的随机增量跟新的效率。
[0047]在本系统中,充分考虑了图数据的特征以及对图数据的访问特性,设计了一种图数据的顶点邻域存储模型,如图2所示。每个Block由三部分组成,第一部分为指向前一个block的指针,第二部分为指向后一个block的指针,第三部分为该block存储的边。此模型可以有效地支持图数据更新。
[0048]本文提出的图数据存储方法在数据更新方面与业界使用的方式有如下几点不同:
[0049]首先,Redis和Neo4j的数据存储采用连续分配的方式,但随着数据不断地更新,超出已分配存储块时,需要分配更大的连续内存块,然后将原来的数据挪动到新块中,并将新数据插入。频繁的数据更新,会造成数据的频繁挪动。尽管Redis采用了一种预先分配机制,每次分配的内存多于实际需要的内存数目,以应对未来可能的数据扩增。但没有从根本上解决内存数据挪动的问题。而本发明采用链接分配的方式,通
当前第2页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1