CN103701469B - 一种大规模图数据的压缩存储方法 - Google Patents
一种大规模图数据的压缩存储方法 Download PDFInfo
- Publication number
- CN103701469B CN103701469B CN201310733597.6A CN201310733597A CN103701469B CN 103701469 B CN103701469 B CN 103701469B CN 201310733597 A CN201310733597 A CN 201310733597A CN 103701469 B CN103701469 B CN 103701469B
- Authority
- CN
- China
- Prior art keywords
- array
- node
- buffer
- sequence
- edgebufferused
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种大规模图数据的压缩存储方法,包括:(1)将原始图数据以行为单位用二进制邻接矩阵M存储;(2)根据邻接矩阵M中每行的偏移值建立散列索引;(3)将邻接矩阵M中每行中的起点按照出度进行升序排序;(4)记录入度为0的节点记为根节点,将根节点按照出度进行降序排序,记为根节点序列;(5)对于根节点序列中的每个节点,以根节点为开始节点,按深度优先策略依次分配ID;(6)遍历邻接矩阵M,将矩阵按照新分配的ID进行转换,以边序列格式存储;(7)对边序列格式数据进行排序;(8)将边序列格式数据按行进行压缩存储。本发明需要的数据存储空间小,随机读取次数少且线程并行度高。
Description
技术领域
本发明涉及高性能计算领域,更具体地说,涉及一种大规模图数据的压缩存储方法。
背景技术
处理和挖掘大型的真实世界关系图并设计可扩展的系统已经成为当今的极为迫切的问题。比如,社交网络图,网页指向图和蛋白质相互作用图等,都特别具有挑战性。因为它们不能真正的被分为可以并行处理的小块,这种并行度上的缺陷,使得分布式计算被很多业界人士所注意。
近几年,一些基于图运算的模型被提出,如Pregel和GraphLab等以顶点为中心的向量模型,在此模型中用户定义一个可以使每个顶点在本地运行的程序;另外,部分图数据高性能计算的系统是基于key-value的,如Piccolo和Spark,可以高效地执行图数据的并行算法;GraphChi提出了并行式滑动窗口,能够异步处理存储中硬盘中的可变图数据,在单机上完成大数据的图计算,但并行滑动的窗口只针对起点和终点不在同一区间内时并行,极大依赖原始数据的特征。
目前,对图数据运算还处于发展阶段,现实生活对图数据的处理需求很大,现有的技术方案解决了一定的问题但仍有许多值得提高的地方。怎样改进图数据的存储和并行方案的设计以适用更广的范围是今后的改进方向之一。
发明内容
鉴于此,本发明的目的在于提供一种大规模图数据的压缩存储方法,该方法通过将关系图数据表达成一个树型结构,根据树型结构的特点将图数据进行行压缩和列压缩,旨在解决现有方法中存在数据存储空间大,随机读取次数多和线程并行度不高的问题。
本发明是通过以下技术方案实现的:
一种大规模图数据的压缩存储方法,包括以下步骤:
(1)将邻接矩阵格式的原始图数据进行处理,以行为单位用二进制邻接矩阵形式存储,邻接矩阵设为变量M,记录每个节点的出度;
(2)根据邻接矩阵M中每行的偏移值建立散列索引HashIndex,其中每一行存储信息为起点,终点数目和起点对应的终点序列;
(3)遍历邻接矩阵M,将邻接矩阵M中每行中的起点按照出度进行升序排序;
(4)遍历结点,记录入度为0的节点,记为根节点,将根节点按照出度进行降序排序,记为根节点序列;
(5)对于根节点序列中的每个节点,以根节点为开始节点,按深度优先策略依次分配ID;
(6)遍历邻接矩阵M,将矩阵按照新分配的ID进行转换,以边序列格式(Edge List Format)存储;
(7)对边序列格式数据进行排序,排序策略为终点优先起点其次,排序方式为并行多路归并的外部排序;
(8)将边序列格式数据按行进行压缩存储。
与现有技术相比,本发明具有以下有益效果:
(1)对数据集的依赖小:通过深度优先树的方式进行重新分配ID,使得相关度高的节点分配在相近的存储块中,块与块间并行时可以提高并行度;
(2)定位速度快:通过以分块的方式存储数据,块内将节点信息与边的信息分开存储,使得块内同样可以使用二分查找的方式定位;
(3)数据局部性高:采用树型结构局部存储,使得计算时同一节点的临近信息在同一区域,减少随机访问的比例。
附图说明
图1为本发明实施例的大规模图数据的压缩存储方法的流程图;
图2为本发明实施例方法中步骤(5)的细化流程图;
图3为本发明实施例方法中步骤(8)的细化流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,本发明实施例的大规模图数据的压缩存储方法,包括以下步骤:
(1)将邻接矩阵格式的原始图数据进行处理,以行为单位用二进制邻接矩阵形式存储,邻接矩阵设为变量M,记录每个节点的出度;
(2)根据邻接矩阵M中每行的偏移值建立散列索引HashIndex,其中每一行存储信息为起点,终点数目和起点对应的终点序列;
(3)遍历邻接矩阵M,将邻接矩阵M中每行中的起点按照出度进行升序排序;
(4)遍历结点,记录入度为0的节点,记为根节点,将根节点按照出度进行降序排序,记为根节点序列;
(5)对于根节点序列中的每个节点,以根节点为开始节点,按深度优先策略依次分配ID。如图2所示,具体包括以下步骤:
(5-1)设置计数器k=1,设根节点序列rootList的长度为rootNum,变量idCount=1,设置数组idMap,将idMap所有元素置为0;
(5-2)判断计数器k是否小于rootNum+1,若是,则进入步骤(5-3),否则进入结束;
(5-3)读取根节点序列rootList中的第k个节点x;
(5-4)设置堆栈S,将节点x压入堆栈S中;
(5-5)判断堆栈S是否为非空,若是,则进入步骤(5-6),否则进入步骤(5-18);
(5-6)将堆栈S顶端元素的值赋值给变量w,S弹出一个元素;
(5-7)判断idMap中第w个位置的元素是否为0,若是,则进入步骤(5-8),否则进入步骤(5-5);
(5-8)将idMap中第w个位置的元素设为idCount;
(5-9)设置idCount=idCount+1;
(5-10)根据散列索引HashIndex获取邻接矩阵M中第w行的偏移值offset;
(5-11)根据偏移值offset,获得邻接矩阵M第w行的数据,包括起始点,终点序列的长度len,和终点序列yList;
(5-12)设置计数器i=1;
(5-13)判断i是否小于len+1,若是进入步骤(5-14),否则进入步骤(5-18);
(5-14)获取终点序列yList中的的第i个元素y;
(5-15)判断idMap中第y个位置的元素是否为0,若是,则进入步骤(5-16),否则进入步骤(5-17);
(5-16)将y压入堆栈S中;
(5-17)设置计数器i=i+1,并进入步骤(5-13);
(5-18)设置计数器k=k+1,并进入步骤(5-2);
(6)遍历邻接矩阵M,将矩阵按照新分配的ID进行转换,以边序列格式(Edge List Format)存储,边序列格式即为起点和终点依次顺序存储;
(7)对边序列格式数据进行排序,排序策略为终点优先起点其次,排序方式为并行多路归并的外部排序;
(8)将边序列格式数据按行进行压缩存储。如图3所示,具体包括以下步骤:
(8-1)新建存储结构类型LineChunk,LineChunk类型中包含成员为起点id,终点id压缩后的字符型数组result,以及字符型数组的长度Len;
(8-2)创建空闲缓冲数组edgeBufferFree[]和已使用缓冲数组edgeBufferUsed[],此二者数组元素类型均为LineChunk;
(8-3)创建数组compress_buffer[],设置计数器k=0,变量chunkUsed=0,用来记录当前块使用情况;
(8-4)判断k是否小于邻接矩阵M的行数N,若是,则进入步骤(8-5),否则结束;
(8-5)读取邻接矩阵M中的第k行数据,包括起始点x,终点序列的长度len,和终点序列yList;
(8-6)将终点序列yList进行压缩存入字符型数组result中,压缩后的长度为charLen。其中,压缩方法可以为类似于TripleBit存储的方式;
(8-7)判断edgeBufferFree[]是否为空,若是,则进入步骤(8-8),否则进入步骤(8-9);
(8-8)新建一个LineChunk类型的单元line,进入步骤(8-10);
(8-9)从edgeBufferFree[]中取出一个单元赋值给line;
(8-10)将起始点x,charLen,和压缩数组result存入单元line中;
(8-11)判断charLen+10是否大于或等于系统设定的块大小pagesize=64KB,若是,设置变量full=1,进入步骤(8-12),否则,设置变量full=0,进入步骤(8-29);
(8-12)将数组edgeBufferUsed的长度值size用二个字节长度存入compress_buffer[]当前块头部,设置id部分的偏移变量idoff=2,边部分的偏移变量edgeoff=idoff+size*(2+4);
(8-13)设置计数器i=1;
(8-14)判断i是否小于size+1,若是则进入步骤(8-15),否则进入步骤(8-20);
(8-15)取出数组edgeBufferUsed[]中的第i个元素edgeBufferUsed[i],将其id存入compress_buffer[]当前块偏移为idoff的位置,idoff自增4;
(8-16)将edgeBufferUsed[i]中的Len加上edgeoff用二个字节长度存入数组compress_buffer[]块偏移为idoff的位置,idoff自增2;
(8-17)将edgeBufferUsed[i]中的压缩数组result存入数组compress_buffer[]当前块偏移为edgeoff的位置,edgeoff自增edgeBufferUsed[i]中的Len值;
(8-18)将元素edgeBufferUsed[i]从数组edgeBufferUsed回收至数组edgeBufferFree[];
(8-19)设置计数器i=i+1,进入步骤(8-14);
(8-20)判断变量full是否为1,若是进入步骤(8-21),否则进入步骤(8-29);
(8-21)compress_buffer[]新增c个块,块大小pagesize,c为(charLen+10)/pagesize向上取整,compress_buffer[]进入下一新建块中;
(8-22)将0x00,line中的id值,charLen分别以二个字节长度、四个字节长度,四个字节长度依次存入数组compress_buffer[]当前块头部;
(8-23)将单元line中的压缩数组result存入compress_buffer[]中;
(8-24)compress_buffer[]新建一个块,compress_buffer[]进入新建块中;
(8-25)设置变量chunkUsed=2,将line回收至edgeBufferFree[],进入步骤(8-31);
(8-26)判断chunkUsed加上charLen是否小于pagesize,若是则进入步骤(8-27),否则进入步骤(8-12);
(8-27)设置变量chunkUsed=chunkUsed+6+charLen;
(8-28)将line中的压缩数组result添加到数组edgeBufferUsed[]尾部,进入步骤(8-31);
(8-29)将line添加到数组edgeBufferUsed[]尾部;
(8-30)chunkUsed=8+charLen;
(8-31)设置计数器k=k+1,进入步骤(8-4)。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (3)
1.一种大规模图数据的压缩存储方法,包括以下步骤:
(1)将邻接矩阵格式的原始图数据进行处理,以行为单位用二进制邻接矩阵形式存储,邻接矩阵设为变量M,记录每个节点的出度;
(2)根据邻接矩阵M中每行的偏移值建立散列索引HashIndex,其中每一行存储信息为起点、终点数目和起点对应的终点序列;
(3)遍历邻接矩阵M,将邻接矩阵M中按照每行中起点的出度进行升序排序;
(4)遍历图中结点,记录入度为0的节点记为根节点,将根节点按照出度进行降序排序,记为根节点序列rootList;
(5)对于根节点序列中的每个节点,以根节点为开始节点,按深度优先策略依次分配ID;
(6)遍历邻接矩阵M,将矩阵按照新分配的ID进行转换,以边序列格式(Edge List Format)存储;
(7)对边序列格式数据进行排序,排序策略为终点优先起点其次,排序方式为并行多路归并的外部排序;
(8)将边序列格式数据按行进行压缩存储。
2.根据权利要求1所述的大规模图数据的压缩存储方法,其中,所述步骤(5)具体包括:
(5-1)设置计数器k=1,设根节点序列rootList的长度为rootNum,变量idCount=1,设置数组idMap,将idMap所有元素置为0;
(5-2)判断计数器k是否小于rootNum+1,若是,则进入步骤(5-3),否则直接结束;
(5-3)读取根节点序列rootList中的第k个节点x;
(5-4)设置堆栈S,将节点x压入堆栈S中;
(5-5)判断堆栈S是否为非空,若是,则进入步骤(5-6),否则进入步骤(5-18);
(5-6)将堆栈S顶端元素的值赋值给变量w,S弹出一个元素;
(5-7)判断idMap中第w个位置的元素是否为0,若是,则进入步骤(5-8),否则进入步骤(5-5);
(5-8)将idMap中第w个位置的元素设为idCount;
(5-9)设置idCount=idCount+1;
(5-10)根据散列索引HashIndex获取邻接矩阵M中第w行的偏移值offset;
(5-11)根据偏移值offset,获得邻接矩阵M第w行的数据,包括起始点,终点序列的长度len,和终点序列yList;
(5-12)设置计数器i=1;
(5-13)判断i是否小于len+1,若是进入步骤(5-14),否则进入步骤(5-18);
(5-14)获取终点序列yList中的的第i个元素y;
(5-15)判断idMap中第y个位置的元素是否为0,若是,则进入步骤(5-16),否则进入步骤(5-17);
(5-16)将y压入堆栈S中;
(5-17)设置计数器i=i+1,并进入步骤(5-13);
(5-18)设置计数器k=k+1,并进入步骤(5-2)。
3.根据权利要求1所述的大规模图数据的压缩存储方法,其中,所述步骤(8)具体包括:
(8-1)新建存储结构类型LineChunk,LineChunk类型中包含成员为起点id,终点id压缩后的字符型数组result,以及字符型数组的长度Len;
(8-2)创建空闲缓冲数组edgeBufferFree[]和已使用缓冲数组edgeBufferUsed[],此二者数组元素类型均为LineChunk;
(8-3)创建数组compress_buffer[],设置计数器k=0,变量chunkUsed=0,用来记录当前块使用情况;
(8-4)判断k是否小于邻接矩阵M的行数N,若是,则进入步骤(8-5),否则直接结束;
(8-5)读取邻接矩阵M中的第k行数据,包括起始点x,终点序列的长度len,和终点序列yList;
(8-6)将终点序列yList进行压缩存入字符型数组result中,压缩后的长度为charLen;
(8-7)判断edgeBufferFree[]是否为空,若是,则进入步骤(8-8),否则进入步骤(8-9);
(8-8)新建一个LineChunk类型的单元line,进入步骤(8-10);
(8-9)从edgeBufferFree[]中取出一个单元赋值给一个LineChunk类型的单元line;
(8-10)将起始点x,charLen,和压缩数组result存入单元line中;
(8-11)判断charLen+10是否大于或等于系统设定的块大小pagesize=64KB,若是,设置变量full=1,进入步骤(8-12),否则设置变量full=0,进入步骤(8-29);
(8-12)将数组edgeBufferUsed的长度值size用二个字节长度存入compress_buffer[]当前块头部,设置id部分的偏移变量idoff=2,边部分的偏移变量edgeoff=idoff+size*(2+4);
(8-13)设置计数器i=1;
(8-14)判断i是否小于size+1,若是则进入步骤(8-15),否则进入步骤(8-20);
(8-15)取出数组edgeBufferUsed[]中的第i个元素edgeBufferUsed[i],将其id存入compress_buffer[]当前块偏移为idoff的位置,idoff自增4;
(8-16)将edgeBufferUsed[i]中的Len加上edgeoff用二个字节长度存入数组compress_buffer[]块偏移为idoff的位置,idoff自增2;
(8-17)将edgeBufferUsed[i]中的压缩数组result存入数组compress_buffer[]当前块偏移为edgeoff的位置,edgeoff自增edgeBufferUsed[i]中的Len值;
(8-18)将元素edgeBufferUsed[i]从数组edgeBufferUsed回收至数组edgeBufferFree[];
(8-19)设置计数器i=i+1,进入步骤(8-14);
(8-20)判断变量full是否为1,若是进入步骤(8-21),否则进入步骤(8-29);
(8-21)compress_buffer[]新增c个块,块大小pagesize,c为(charLen+10)/pagesize向上取整,compress_buffer[]进入下一新建块中;
(8-22)将0x00,line中的id值,charLen分别以二个字节长度、四个字节长度,四个字节长度依次存入数组compress_buffer[]当前块头部;
(8-23)将单元line中的压缩数组result存入compress_buffer[]中;
(8-24)compress_buffer[]新建一个块,compress_buffer[]进入新建块中;
(8-25)设置变量chunkUsed=2,将line回收至edgeBufferFree[],进入步骤(8-31);
(8-26)判断chunkUsed加上charLen是否小于pagesize,若是则进入步骤(8-27),否则进入步骤(8-12);
(8-27)设置变量chunkUsed=chunkUsed+6+charLen;
(8-28)将line中的压缩数组result添加到数组edgeBufferUsed[]尾部,进入步骤(8-31);
(8-29)将line添加到数组edgeBufferUsed[]尾部;
(8-30)chunkUsed=8+charLen;
(8-31)设置计数器k=k+1,进入步骤(8-4)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310733597.6A CN103701469B (zh) | 2013-12-26 | 2013-12-26 | 一种大规模图数据的压缩存储方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310733597.6A CN103701469B (zh) | 2013-12-26 | 2013-12-26 | 一种大规模图数据的压缩存储方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103701469A CN103701469A (zh) | 2014-04-02 |
CN103701469B true CN103701469B (zh) | 2016-08-31 |
Family
ID=50362888
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310733597.6A Active CN103701469B (zh) | 2013-12-26 | 2013-12-26 | 一种大规模图数据的压缩存储方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103701469B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR102491597B1 (ko) * | 2014-12-10 | 2023-01-25 | 킨디 인코포레이티드 | 조합 하이퍼맵 기반 데이터 표현 및 연산을 위한 장치 및 방법 |
CN107203635B (zh) * | 2017-06-07 | 2020-08-11 | 南开大学 | 一种基于最小略图的流模式下有向标签图的略图构建方法 |
CN109299615B (zh) * | 2017-08-07 | 2022-05-17 | 南京邮电大学 | 一种面向社交网络数据的差分隐私处理发布方法 |
CN109359156B (zh) * | 2018-08-14 | 2021-10-08 | 阿里巴巴(中国)有限公司 | 数据存储结构处理方法和装置 |
CN109189763A (zh) * | 2018-09-17 | 2019-01-11 | 北京锐安科技有限公司 | 一种数据存储方法、装置、服务器及存储介质 |
CN110719106B (zh) * | 2019-09-27 | 2021-08-31 | 华中科技大学 | 一种基于节点分类排序的社交网络图压缩方法及系统 |
CN111737540B (zh) * | 2020-05-27 | 2022-11-29 | 中国科学院计算技术研究所 | 一种应用于分布式计算节点集群的图数据处理方法和介质 |
CN113282776B (zh) * | 2021-07-12 | 2021-10-01 | 北京蔚领时代科技有限公司 | 用于图形引擎资源文件压缩的数据处理系统 |
CN117370619B (zh) * | 2023-12-04 | 2024-02-23 | 支付宝(杭州)信息技术有限公司 | 图的分片存储和子图采样方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521299A (zh) * | 2011-11-30 | 2012-06-27 | 华中科技大学 | 资源描述框架数据的处理方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100174739A1 (en) * | 2007-03-30 | 2010-07-08 | Albert Mons | System and Method for Wikifying Content for Knowledge Navigation and Discovery |
-
2013
- 2013-12-26 CN CN201310733597.6A patent/CN103701469B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102521299A (zh) * | 2011-11-30 | 2012-06-27 | 华中科技大学 | 资源描述框架数据的处理方法 |
Non-Patent Citations (2)
Title |
---|
2-Trees for compact Web graph representation;Brisaboa N R.etc;《String Processing and Information Retrieval》;20090827;第5721卷;18-30 * |
高可扩展的RDF数据存储系统;袁平鹏 等;《计算机研究与发展》;20121220;第49卷(第10期);2131-2141 * |
Also Published As
Publication number | Publication date |
---|---|
CN103701469A (zh) | 2014-04-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103701469B (zh) | 一种大规模图数据的压缩存储方法 | |
CN103488709B (zh) | 一种索引建立方法及系统、检索方法及系统 | |
CN104866497B (zh) | 分布式文件系统列式存储的元数据更新方法、装置、主机 | |
CN104516894B (zh) | 用于管理时间序列数据库的方法和装置 | |
CN103140840B (zh) | 数据管理的方法及装置 | |
CN104361113B (zh) | 一种内存‑闪存混合存储模式下的olap查询优化方法 | |
CN106326421B (zh) | 基于索引树和数据链表的fpga并行排序方法及系统 | |
CN103324699B (zh) | 一种适应大数据应用的快速重复数据删除方法 | |
CN103714013B (zh) | 一种文件系统的存储空间的配置方法及装置 | |
CN106844089A (zh) | 一种用于恢复树形数据存储的方法与设备 | |
CN107577436A (zh) | 一种数据存储方法及装置 | |
CN104021223B (zh) | 一种集群数据库测点的访问方法及装置 | |
WO2020082597A1 (zh) | 一种b+树节点的批量插入和删除方法及装置 | |
CN107766406A (zh) | 一种采用时间优先搜索的轨迹相似性连接查询方法 | |
CN106293525A (zh) | 一种提高缓存使用效率的方法及系统 | |
CN102609490A (zh) | 一种面向列存储dwms的b+树索引方法 | |
CN108388509A (zh) | 一种软件测试方法、计算机可读存储介质及终端设备 | |
CN109033173A (zh) | 一种用于生成多维指标数据的数据处理方法及装置 | |
CN106648991A (zh) | 数据容灾系统中的重复数据删除方法 | |
CN105359142A (zh) | 哈希连接方法、装置和数据库管理系统 | |
CN110020272A (zh) | 缓存方法、装置以及计算机存储介质 | |
CN105045891B (zh) | 提高顺序表性能方法、系统、架构、优化方法及存储装置 | |
CN108614879A (zh) | 小文件处理方法与装置 | |
CN109189725A (zh) | 面向规则建筑物的obj文件无损压缩方法 | |
CN105320609A (zh) | 一种基于移动终端的数据存储方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |