一种内存数据存储方法
【专利摘要】本发明提供一种内存数据存储方法,包括:将数据表分解成若干数据块;将每个数据块以行的形式分解成若干大小相同的行数据分组集合;将待存储的数据以列的形式存储在行数据分组集合的数据区;将行数据分组集合中的数据行数、每列数据的字节数写入元数据表头区;对数据区的数据建立索引,写入索引区;将同步标记写入同步标记区,以区分连续的行数据分组集合;分别对行数据分组集合的各个区域进行数据压缩;对数据块进行数据压缩。本发明采用行、列混合存储模式,具备了相当于行存储的数据加载速度和负载适应能力,避免了数据查询时不必要的列读取,混合了多种数据压缩方式,对列维度进行压缩,有效提升了内存空间的利用率。
【专利说明】一种内存数据存储方法
[0001]
技术领域
[0002]本发明涉及计算机应用技术领域,具体是一种内存数据存储方法。
[0003]
【背景技术】
[0004]目前内存数据存储大多采用行式或者列式存储,行存储数据加载快,但是无法避免读取不必要的列,海量数据查询性能低,列存储查询性能高,但是加载慢,同时,行或者列存储都存在压缩率低、内存空间使用浪费的问题。
[0005]
【发明内容】
[0006]本发明的目的在于提供一种内存数据存储方法,采用行、列混合存储模式,能够充分发挥行存储写入性能的优势以及列存储读取性能的优势,提高内存空间利用率。
[0007]本发明的技术方案为:
一种内存数据存储方法,包括以下步骤:
(1)将数据表分解成若干数据块;
(2)将每个数据块以行的形式分解成若干大小相同的行数据分组集合,所述行数据分组集合分为四个区域,分别是同步标记区、元数据表头区、数据区和索引区;
(3)将待存储的数据以列的形式存储在行数据分组集合的数据区;
(4)将行数据分组集合中的数据行数、每列数据的字节数写入元数据表头区;
(5)对数据区的数据建立索引,写入索引区;
(6)将同步标记写入同步标记区,以区分连续的行数据分组集合;
(7)分别对行数据分组集合的各个区域进行数据压缩;
(8)对数据块进行数据压缩。
[0008]所述的内存数据存储方法,所述步骤(7)具体包括:
a、对元数据表头区中的数据采用行程长度编码算法进行压缩;
b、对数据区进行数据压缩时,对于重复值低于预设阈值的列,若为整型数据,则采用行程长度编码算法进行压缩,若为字符型数据,则采用字典编码算法进行压缩,对于重复值高于预设阈值的列,则采用gzip算法进行压缩。
[0009]由上述技术方案可知,本发明采用行、列混合存储模式,具备了相当于行存储的数据加载速度和负载适应能力,避免了数据查询时不必要的列读取,混合了多种数据压缩方式,对列维度进行压缩,有效提升了内存空间的利用率。
[0010]
【附图说明】
[0011 ]图1是本发明的方法流程图;
图2是本发明的数据存储示意图。
[0012]
【具体实施方式】
[0013]下面结合附图和具体实施例进一步说明本发明。
[0014]如图1所示,一种内存数据存储方法,包括以下步骤:
S1、将数据表分解成若干数据块Block。
[0015]S2、将每个数据块Block以行的形式分解成若干大小相同的行数据分组集合RowGroup,每个Row Group包含四个区域,分别是同步标记区Sync Marker、元数据表头区Metadata Header、数据区Data、索引区Index。
[0016]Sync Marker用于区分一个Block中两个连续的Row Group;Metadata Header用于记录每个Row Group中有几行数据、每列数据有多少字节以及每列数据中每一行数据的字节数;Data用于按列存储Row Group中的实际数据,Index用于存储轻量级的索引数据。
[0017]S3、将待存储的数据以列的形式存储在Row Group的Data中;将Row Group中的数据行数、每列数据的字节数写入Metadata Header中JfData中的数据建立索引,写入Index中;将同步标记写入Sync Marker中,以区分连续的Row Group。
[0018]S4、分别对Row Group的各个区域进行数据压缩:
对于Metadata Header中的数据采用行程长度编码RLE(Run Length Encoding)算法进行压缩,因为对于记录每列数据中每一行数据的字节数是一样的,这些数字重复连续出现,因此采用这种算法可以获得较高的压缩比。在对Data中的实际数据进行压缩时,对于重复值较少的列,Integer类型的列采用RLE算法进行压缩,String类型的列采用字典编码DE(Dict1nary Encoding)算法进行压缩,对于重复值较多或者数据量较大的列,采用gzip算法进行压缩。
[0019]S5、采用gzip算法对Block进行数据压缩,在查询时,可配合延迟解压算法(LazyDecompress1n)。
[0020]本发明将内存数据混合行式和列式进行存储,通过先进行水平分区,将尽可能多的数据记录以行式进行存储,再垂直分区,在每个数据块内进行列式存储,并且保证原始同一行的数据都在同一个结点上,如图2所示。
[0021]本发明可应用于电力系统运营监测中心,提升了内存数据的读写性能,同时也提高了内存空间的利用率。
[0022]以上所述实施方式仅仅是对本发明的优选实施方式进行描述,并非对本发明的范围进行限定,在不脱离本发明设计精神的前提下,本领域普通技术人员对本发明的技术方案作出的各种变形和改进,均应落入本发明的权利要求书确定的保护范围内。
【主权项】
1.一种内存数据存储方法,其特征在于,包括以下步骤: (1)将数据表分解成若干数据块; (2)将每个数据块以行的形式分解成若干大小相同的行数据分组集合,所述行数据分组集合分为四个区域,分别是同步标记区、元数据表头区、数据区和索引区; (3)将待存储的数据以列的形式存储在行数据分组集合的数据区; (4)将行数据分组集合中的数据行数、每列数据的字节数写入元数据表头区; (5)对数据区的数据建立索引,写入索引区; (6)将同步标记写入同步标记区,以区分连续的行数据分组集合; (7)分别对行数据分组集合的各个区域进行数据压缩; (8 )对数据块进行数据压缩。2.根据权利要求1所述的内存数据存储方法,其特征在于,所述步骤(7)具体包括: a、对元数据表头区中的数据采用行程长度编码算法进行压缩; b、对数据区进行数据压缩时,对于重复值低于预设阈值的列,若为整型数据,则采用行程长度编码算法进行压缩,若为字符型数据,则采用字典编码算法进行压缩,对于重复值高于预设阈值的列,则采用gzip算法进行压缩。
【文档编号】G06F3/06GK105824574SQ201510882588
【公开日】2016年8月3日
【申请日】2015年12月7日
【发明人】夏同飞, 杨栋枢, 陈 峰, 李志 , 徐海青, 范叶平, 孙飞, 刘才华, 石磊, 魏建国, 袁东, 王维佳, 王超, 郭振, 胡传胜, 乔雄
【申请人】国家电网公司, 南京南瑞集团公司, 国网江苏省电力公司信息通信分公司, 安徽继远软件有限公司, 国网信息通信产业集团有限公司