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

文档序号:8922524阅读:来源:国知局
过block管理池管理空闲内存块,已分配的内存块链接成双向链表,数据的更新发生在链表末尾,不用引起数据的挪动和复制。
[0050]其次,在Redis和Neo4j中,图数据的顶点和边分别存储,而本文提出的方法直接存储图的顶点邻域。存储相同规模的图数据,Redis和Neo4j需要启动更多数目的网络I/Oo Redis和Neo4j启动1/0的次数为图顶点数目和边数目之和,而本发明启动1/0的次数为图顶点数目,而在社交媒体图结构中,图的边数目是远远大于图顶点数目。即便可以采用批量数据传输,由于Redis和Neo4j数据访问采用类似SQL的查询语言,需要将写入的数据在客户端转换为批量查询语句,并且在服务器端经过解析执行,转换和解析影响了效率。而本发明本身采用顶点及其邻域作为数据组织单位,在远程访问过程中,客户端采用buffer缓存待写入目标机器的数据,当缓冲区满,或者超时事件发生,才将buffer中的数据批量地发送给目标机器。
[0051]最后,Neo4j每次数据更新,都是事务操作,服务期需要将数据写入同步到磁盘文件中。而Redis采用RDB的机制,通过后台1/0线程将内存中某一时间断面的数据写入到磁盘文件中,每次写入过程会阻塞其他更新。而本发明在更新时,采用mmap接口,在内存区域和磁盘文件之间建立映射,数据写入到内存区域,由操作系统内核负责将数据更新同步到磁盘文件中。
[0052]综合以上不同点,本发明在做数据更新的过程中在设计上有多个优势,可以达到更高的更新性能。
[0053]自适应数据规模的存储管理策略
[0054]图计算的数据访问具有很高的随机性,采用内存组织数据能够提高数据随机访问效率。然后,图数据的数据规模具有海量性,集群的有限内存无法负载大规模图数据。本文提出了自适应数据规模的内存管理策略,优先使用内存组织图数据,当内存资源耗尽时,容许数据溢出到磁盘中。具体的做法是:将图数据管理系统的可以使用的存储资源分成两类,一类是粗粒度存储资源,另一类是细粒度存储资源。
[0055]粗粒度资源对应本地Linux文件系统的预先分配的大文件,文件大小为2GB、4GB甚至更大,前提是不超过集群单个节点可用内存容量。运行时,粗粒度资源被全部加载,并常驻于内存。细粒度资源对于本地Linux文件系统的按需分配的小文件,文件大小为4MB、8MB,而且小文件的数目随着图数据的增加不断变大。运行时,无法将粗粒度资源和全体细粒度资源全部置于内存,因此在内存中开辟有界缓存窗口,按需将细粒度资源载入窗口。当窗口被占满,需要加载新的细粒度资源时,需要根据缓存替换算法,选择窗口中已有的细粒度资源,将其换出,然后载入新的资源。
[0056]两类资源都被划分成固定大小的Block,全体Block拥有唯一的Block ID,可以根据BlockID随机地访问Block。Block是存储资源的基本分配单位,由Block池管理器负责分配和回收Block。当顶点邻域的Block双向链表头部未满时,需要为新插入边分配新的Block作为链表的头部;当删除顶点邻域的旧边时,需要释放和回事空的Block。所有的Block要么处于空闲状态,要么属于某个指定的顶点邻域。
[0057]资源分配时,可以根据数据的规模动态地选择存储资源。首先从粗粒度资源开始分配,目的是尽量采用内存组织数据。当粗粒度资源耗尽时,开始按需地动态地分配细粒度资源,存储溢出内存的数据。顶点邻域中的边以时间戳有序存储,可以定期地扫描图数据,将过期的图数据从粗粒度资源中删除,转存到细粒度资源中,从而是内存中的数据保持新鲜。
[0058]采用自适应数据规模的存储分配策略,既可以尽力使用内存组织数据,从而提高数据访问的随机性,又允许图数据规模增大时,将数据从内存溢出到磁盘中,解决了海量图数据的管理问题。
[0059]应用感知的异地预取策略
[0060]在本发明中,为了加快异地数据访问的效率,提出了一种感知应用特征的异地预取的机制。通过该机制,更够显著地提高异地数据访问的吞吐率。
[0061]图数据的访问,类似于访问顺序存储的数据,具有明显的局部性。图计算的算法一般基于图的遍历算法。以广度优先遍历为例,访问顶点V时,V的k阶邻域(从顶点V出经过最短距离k条边可达的全部顶点构成的集合)的顶点被访问概率随着k增大而降低,因此,处理V的访问请求时,系统根据顶点位置信息可以预测近期最有可能被访问的顶点,将顶点V和近期最有可能被访问的顶点的数据合并在一起,传输给请求者。请求者将预先取得的数据缓存在本地,下次获取异地数据时,先检查本地的缓存,如果存在,直接访问本地即可,否则向异地请求数据。
[0062]很多图计算框架会顺序地读取图数据的子图的全部顶点,此时,可以采用顺序预取的方式。预取方式的选择要符合图计算的数据访问特点,可以提供多种预取的策略,让用户选择从中选择最佳的预取策略。
[0063]实例I数据访问实例
[0064]本发明测试了本发明以及比较系Redis和Neo4j在不同并发量下的写性能,该写性能取了十个数据集下的平均值,其中在测试图3中,本发明使用NYNN表示。
[0065]由图3可知,本发明本地写性能明显优于Redis和Neo4j,元数据的设计和数据传输格式和数据写入的机制影响了写的性能。首先本发明图数据的划分采用连续的等宽顶点区间,能够通过首次数据写入请求,将元数据缓存在本地,此后使用缓存在本地的元数据进行数据寻址,这样减少了寻址的1开销。写入数据的时候,自己写入本地的内存映射文件中。Redis和Neo4j都提供了方便使用的查询命令/语言,先将用户写入数据的请求,封装成查询命令,然后通过本地网络发送给server,由server负责解析命令,完成查询。
[0066]本发明测试了本发明以及比较系Redis和Neo4j在不同并发量下的读性能,该读性能取了十个数据集下的平均值。
[0067]如图4所示,本地读操作,本发明可以达到GB/s量级,而Redis和Neo4j是1MB/s?lOOMB/s,本发明可以直接将图数据通过_ap接口映射到客户进程的地址空间中,进行操作。而Redis和Neo4j采用查询命令向server请求数据。
[0068]为了反应图数据存储系统的存储效率,本发明比较了多个系统的存储膨胀比,即存储同样多的数据,看内存和磁盘的占用膨胀比。
[0069]如图5所示,对比Redi s,Neo4j和本发明的磁盘使用情况,可以明显的观察到,Neo4j作为基于磁盘的存储系统,占用磁盘空间最大,数据存储的时候,需要存储属性值和属性名,而且属性值采用字符串的形式存储。Redis所需的磁盘存储空间最少,Redis的数据持久化之前,将数据进行压缩。而内存的使用中,Redis的内存使用最大,因为Redis将全部数据加载到内存。Neo4j和本发明都可以配置所需内存的大小。
[0070]本发明测试了本发明以及比较系Redis和Neo4j在不同并发量下的远程写性能,该写性能取了十个数据集下的平均值。
[0071]如图6所示,远程写数据,本发明的性能明显高于Neo4j和R
当前第3页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1