一种面向云数据库的非结构化数据的存储与管理方法.pdf

上传人:111****112 文档编号:1285434 上传时间:2018-04-12 格式:PDF 页数:22 大小:1.17MB
返回 下载 相关 举报
摘要
申请专利号:

CN201610884272.1

申请日:

2016.10.10

公开号:

CN106503084A

公开日:

2017.03.15

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 17/30申请日:20161010|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

中国科学院软件研究所

发明人:

魏闫艳; 郭皓明; 王之欣; 庞廓; 焉丽; 田霂

地址:

100190 北京市海淀区中关村南四街4号

优先权:

专利代理机构:

北京君尚知识产权代理事务所(普通合伙) 11200

代理人:

邱晓锋

PDF下载: PDF下载
内容摘要

本发明属于非结构化云存储管理研究与应用领域,具体涉及一种面向云数据库的非结构化数据存储与管理方法。针对云环境中,以json数据为代表的非结构话数据底层存储特点,本发明基于虚拟分块的方式实现非定长数据记录的分割与基本存储,通过虚拟分块的链表关系实现数据记录的排序与提取。同时,为存储分块建立索引,实现存储空间的碎片回收与数据记录的倒排索引。通过本发明的数据存储管理技术,可以有效满足海量、非结构化数据应用场景下,数据库底层数据高性能读写的要求。同时,可以提高存储空间利用效率。本发明在互联网数据库、云化服务集成环境、物联网等方面具有积极的应用价值。

权利要求书

1.一种面向云数据库的非结构化数据的存储与管理方法,其步骤包括:
第一步:建立基于数据模型的存储架构,所述数据模型包括数据块、块占用索引、行占
用索引与数据记录索引;数据块由一组长度确定的虚数据行构成,虚数据行由行存储信息、
存储链首位指针以及有效存储空间构成;块占用索引是以位图的方式记录各个数据块的空
闲存储空间占用状态;行占用索引采用位图索引的方式标记数据块中虚数据行的空间占用
状态;数据记录索引通过行号、块索引指针、数据记录的总长度标记数据记录的索引位置;
第二步:在非结构化数据存储过程中,根据其长度计算所占用的虚数据行数量,从行占
用索引中获取未被占用的首个虚数据行位置,而后将当前数据写入该虚数据行中;如果当
前数据记录的长度超过一条虚数据行的容纳空间,则在数据块中继续获取未被占用的虚数
据行,继续写入,直到全部数据写入数据块中对应的虚数据行集中;同时,在虚数据行之间
的存储链之间建立链接关系,实现数据提取过程中的定位;
第三步:完成数据写入后,更新对应的块占用索引、行占用索引与数据记录索引信息;
第四步:在数据提取过程中,扫描数据块中的虚数据行,过滤识别其中数据记录的首行
信息,实现数据记录的提取;
第五步:在数据更新操作过程中,根据数据长度的变换调整其所占用的虚数据行数量
并变更其中的记录内容,同时更新块占用索引、行占用索引、数据记录索引中的占用信息;
第六步:在碎片回收过程中,以虚数据行为单位进行存储空间的回收。
2.如权利要求1所述的方法,其特征在于,所述虚数据行中,行存储信息用于记录当前
行的类型、数据记录指针、数据记录长度、以及当前虚数据行的有效存储数据的字节长度;
存储链首位指针用于记录当前数据记录占用的存储链中下一个虚数据行的指针位置。
3.如权利要求1所述的方法,其特征在于,一条非结构化数据记录在一组虚数据行中实
现存储;当该非结构化数据记录长度小于一条虚数据行有效存储长度时,其占用一条虚数
据行;当该非结构化数据记录长度大于一条虚数据行有效存储长度时,其占用的虚拟行数
量由其数据长度与虚数据行有效长度的比值确定。
4.如权利要求1所述的方法,其特征在于,当一条数据记录占用多个虚数据行时,这些
虚数据行首位之间通过指针形成链表关系,实现虚数据行之间的顺序链接关系。
5.如权利要求1所述的方法,其特征在于,在数据存储过程中,根据数据记录的长度计
算所占用的虚数据行的数量,首先从块占用索引中获取存在剩余存储空间的数据块,利用
行占用索引锁定剩余存储空间大于或等于数据记录存储所需的虚数据行数量的数据块。
6.如权利要求5所述的方法,其特征在于,根据数据块的行占用索引的标记,将数据记
录映射成虚数据行列表。
7.如权利要求5所述的方法,其特征在于,在数据记录的写入完成后,更新相应的行占
用状态,实现行占用索引的实时维护。
8.如权利要求7所述的方法,其特征在于,在行占用索引维护完成后,扫描行占用索引,
若当前行占用索引不存在未被占用的虚数据行,则更新当前数据块的状态为全部占用。
9.如权利要求1所述的方法,其特征在于,在数据提取的过程中,从数据记录索引中获
取数据记录的首行信息,扫描数据块中的虚数据行,获取首行;若数据记录的长度超过虚数
据行的最大存储长度,则根据虚数据行的尾部存储指针获取下一个虚数据行的位置信息继
续提取,直到全部数据提取完成。
10.如权利要求1所述的方法,其特征在于,在碎片回收的过程中,仅需修改被回收虚数
据行的首尾信息同时变更该虚数据行在行占用索引中位图对应字节值即可;然后清除相应
的数据记录索引,将虚数据行的占用状态置为未被占用,同时确保当前数据块的占用状态
为未被全部占用。

说明书

一种面向云数据库的非结构化数据的存储与管理方法

技术领域

本发明属于非结构化云存储管理研究与应用领域,具体涉及一种面向云数据库的
非结构化数据存储与管理方法。

背景技术

近年来,随着物联网、互联网的发展,信息系统处理、交换的数据在形态上发生较
大变换,非结构化数据逐渐成为信息系统内部以及信息系统之间互操作的载体,例如json
数据、xml数据等。这些数据在语义表达上具有部分确定性,在数据的长度上存在较强的不
确定性。由于非结构化数据的特点导致其底层基本操作方面的效率存在一定制约,由此形
成云化信息系统的瓶颈。非机构化数据的存储管理也逐渐成为数据库领域重要研究与发展
方向。

数据的存储与管理除了数据写入外,还包括数据的删除与更新等基本操作。关系
数据库是传统信息系统中实现数据存储、管理的主要工具。关系数据库以关系代数为基础,
通过数据建模实现结构化定义。这一结构化本质上是为数据的语义表达与数据长度进行确
定性的处理。在数据增量过程中,根据这一确定性的结构定义实现数据的读写操作组织。数
据库在底层操作过程中,为数据建立rowIndex,以散列处理的方式,在数据存储分块
(dBlock)中建立存储位置指针与rowIndex之间确定性的映射关系。由于数据在结构与长度
上具有确定性的特点。因此在dBlock中空间利用效率较高。同时,在数据的更新与删除操作
中,一条数据记录在dBlock中的内容变化不会影响其它数据记录的存储位置,存储分块中
的碎片回收简单,且空间利用效率较高。

在云存储环境中,大量数据以非结构化的形式存在。一条数据记录的长度无法在
数据模型中确定性的描述。在数据写入过程中,由于数据记录的存储空间长度无法确定,导
致其位置不能通过散列操作建立存储指针与rowIndex之间的映射关系,无法在实现非结构
化数据的正确基本读写操作。

云环境中上述存储管理基本问题逐渐引起研究人员的注意。2000年以来,Google
等一批研究机构以云计算为基础,先后推出键值(key-value)数据库为代表的大数据存储、
查询解决方案。基于key-value的的云数据存储查询技术具有高可扩展性、高可用性和容错
性等特点,能够实现对海量数据的高效存储与查询的目的。在云数据库底层存储中,数据记
录以序列的方式在dBlock中一次写入。同时,以rowIndex建立底层倒排索引,实现数据记录
在dBlock中存储位置的记录。在数据读取过程中,利用这一倒排索引实现数据记录的检索、
定位与提取。这一方式具有结构简单,空间利用率高的优势。将底层倒排索引与散列相结合
能有效提高检索效率,数据记录的提取受数据集规模大小的影响较小。

上述非结构化数据底层存储存储管理技术在数据只有简单的增量与查询场景中
表现较好。然而,在多数信息系统中,数据除了简单读写外还具有更新、删除操作的要求。在
这一场景中,上述手段的适应性存在一定问题。在数据更新、删除操作过程中,由于数据记
录在操作前后占用空间长度的变化,在dBlock中形成较多的碎片。为了提高空间利用率就
需要进行碎片回收。在碎片回收过程中,形成大量的数据搬运、迁移以及对应指针与索引的
更新操作,导致数据存储管理的效率较低,不能满足云环境中应用对数据底层读写的要求。

发明内容

围绕上述问题,本发明提出一种面向云数据库的非结构化数据的存储与管理方
法。

本发明的面向云数据库的非结构化数据的存储与管理方法中,数据存储由数据块
(dBlock)、块占用索引(dBlockFreeIdx)、行占用索引(vLineIdx)与数据记录索引(dIdx)构
成。dBlock由一组长度确定的虚数据行(vLine)构成。vLine由行存储信息、存储链首位指针
以及有效存储空间构成。其中行存储信息用于记录当前行的类型、数据记录指针、数据记录
长度、以及当前虚数据行的有效存储数据的字节长度。存储链首位指针用于记录当前数据
记录占用的存储链中下一个vLine的指针位置。行占用索引采用位图索引的方式标记
dBlock中vLine的空间占用状态。

在非结构化数据存储过程中,根据其长度计算所占用的vLine数量,从行占用索引
vlineIdx中获取未被占用的首个vLine位置,而后将当前数据写入该vLine中,如果当前数
据记录的长度超过一条vLine的容纳空间,则在dBlock中继续获取未被占用的vLine,继续
写入,直到全部数据写入dBlock中对应的vLine集中。同时,在vLine之间的存储链之间建立
链接关系,实现数据提取过程中的定位。完成数据写入后,更新对应的vlineIdx与数据记录
索引dIdx信息。

在数据提取过程中,扫描dBlock中vLine,过滤识别其中数据记录的首行信息,实
现数据记录的提取。在这一过程中如果数据记录长度超过vLine的长度,则根据vLine尾部
存储链指针定位下一个的vLine的位置继续提取,直到全部数据提取完成。

在数据更新操作过程中,根据数据长度的变换调整其所占用的vLine数量并变更
其中的记录内容。同时更新vLineIdx中的占用信息。

在碎片回收过程中,以vLine为单位进行回收。在回收过程中仅需修改被回收
vLine的首尾信息同时变更该vLine在vLineIdx中位图对应字节值即可。

本发明的有益效果如下:

针对云环境中,以json数据为代表的非结构化数据底层存储特点,本发明基于虚
拟分块的方式实现非定长数据记录的分割与基本存储,通过虚拟分块的链表关系实现数据
记录的排序与提取;同时,为存储分块建立索引,实现存储空间的碎片回收与数据记录的倒
排索引。通过本发明的数据存储管理技术,可以有效满足海量、非结构化数据应用场景下,
数据库底层数据高性能读写的要求。同时,可以提高存储空间利用效率。这一方法在互联
网、云化服务集成环境、物联网等方面具有积极的应用价值。

附图说明

图1存储结构示意图。

图2数据块存储模型示意图。

图3虚数据行示意图。

图4数据接入执行流程图。

图5索引维护执行流程图。

图6块占用索引维护过程图。

图7数据记录索引维护过程图。

图8数据删除过程图。

图9数据记录长度小于虚拟行长度更新过程图。

图10数据记录长度大于虚数据行长度更新过程图。

图11数据提取过程图。

具体实施方式

针对海云协同工作平台操作行为数据的高效存取和修改的需求,本发明提出一种
高性能的非结构化数据存储与索引技术。这一技术在底层实现对非结构化数据的高效存
储。同时,在存储过程中,根据数据长度的不同进行倒排序索引的维护。利用倒排序索引,实
现数据的快速更新和删除操作。在这一基础上,根据索引数据实现数据的高效提取。其整体
的存储架构如图1,具体实施内容如下:

一.数据模型

在数据增量过程中,将数据记录以非结构化的方式实现底层存储。针对数据接入
的过程,有如下定义:

存储页

dataPage={dBlockFreeIdx,dBlocki|i=1,2,…n}

存储页,包含dBlockFreeIdx和dBlock两个部分。其中,dBlockFreeIdx表示块占用
索引,用以记录当前存储页的各个数据块是否存在空闲的存储空间。dBlock表示数据块,用
于实际存储数据。一个存储页包含多个数据块,数据块的个数和大小可根据实际情况进行
设定。

数据块

dBlock={vLinei|i=1,2,…,MaxLineNum}

数据块为实际数据存储的基本单元。vLine表示虚数据行,每个数据块内存储多条
虚数据行(图1中HEOF表示行首起始符,datacache表示虚数据行存储空间,TEOF表示行尾截
止符)。若以MaxLineNum表示数据块存储的最大行数,以MaxDBlock表示数据块的最大容量,
以VLineLength表示vLine的最大长度,则存在以下关系:

其中,MaxDBlock建议取值为
VLineLength的整数倍。

本发明根据实际使用情况,将数据块的容量MaxDBlock设置为1024K,虚数据行的
最大长度VLineLength设置为256Byte,则数据块存储的最大行数MaxLineNum的值为4096。

如图2所示,即为本例中的数据块存储模型。

虚数据行

vLine={type,head,length,curLength,next,content}

虚数据行表示实际存储在数据块中的当前数据的虚行信息。数据记录映射成虚数
据行后,执行实际的存储操作。一条数据记录可以映射成n行vLine,其中n满足n>=1且n<=
MaxLineNum。如图3所示,为vLine的存储结构。

其中:

type表示vLine的类型,用于标记该vLine是否为数据记录存储的首行。type预留
位占据1位存储空间,0表示非数据记录首行,1表示数据记录首行。

head表示行首预留位,记录当前vLine所属的数据记录的首个虚数据行的存储位
置。行首预留位存储的最大值为最后一行vLine的起始位置,其值为1024K-256Byte+1即220-
28+1,故本例中head占用20位存储空间。

length表示当前数据记录的总长度,本例中一个数据块的最大容量为1024K=
220Byte,故数据记录的最大长度必然小于220Byte,本例中length占用20位存储空间。

curLength表示当前数据记录在本条vLine内的实际有效长度,本例中的
curLength<256Byte即28Byte,故本例中curLength占用8位存储空间。

next表示行尾预留位,记录当前数据记录的下一条vLine的起始位置。若当前
vLine为最后一行,则置为空值,否则记录下一条vLine的起始位置。next记录的最大值为最
后一行vLine的起始位置,其值的计算过程和head相同,本例中分配20位存储空间。

content表示当前vLine存储的有效数据,本例中的长度为256Byte-(1+20+20+8+
20)bit,即247字节。

因此,vLine的实际长度为247Byte+(1+20+20+8+20)bit=256Byte-3bit,故每行
vLine比预期的256Byte少占用3位存储空间,每个数据块dBlock比预期的1024K存储空间少
占用1.5K,实际的存储空间为1022.5K。

数据记录

data表示数据记录,是待接入的原始数据,是满足一定规则条件的合法的非结构
化字节流。其字节流长度小于等于一个数据块存储的有效字节流的总长度。

块占用索引

dBlockFreeIdx表示块占用索引,用以记录当前存储页的各个数据块是否存在空
闲的存储空间。块占用索引是以位图的方式记录各个数据块的空闲存储空间是否占用。以0
表示当前数据块不存在空闲存储空间,以1表示当前数据块存在空闲空间,每个数据块占用
一位数据位来记录当前数据块是否存在空闲数据空间。

块索引

dBlockIdx={vLineIdx,dIdx}

块索引表示数据块的索引信息,包含行占用索引和数据记录索引两部分。其中,
vLindIdx表示行占用索引,dIdx表示数据记录索引。

行占用索引

vLineIdx表示行占用索引,是以位图的方式记录当前数据块的虚数据行是否被占
用。以0表示当前行未被占用,以1表示当前行被占用。行占用索引文件以MaxLineNum位存储
空间表示。

数据记录索引

dIdx={(i,loc,len)i|i=1,2,……n}

数据记录索引用于记录第i条数据记录在数据块dBlock中存储的虚数据行vLine
的起始位置。其中,i为数据记录序列中第i条记录;loc表示块索引指针,指向数据块中存储
的虚数据行的起始位置;len表示该数据记录的总长度。

数据写入的过程如下:

1.接收原始数据data,获取数据记录的序号i,并计算data的长度len及所需的存
储空间的大小。

needSpace=getSpace(data),表示存储data所需要的存储空间的大小。

2.获取当前数据存储页,定位当前的数据存储块;

dBlock=getCurDBlock,

freeSpace=getFreeSpace(dBlock),

firstLine=getFirstFreeLine(dBlock),

其中,freeSpace满足freeSpace>=needSpace,firstLine表示dBlock中的首个空
行行号。

3.在当前的数据存储块中存储数据data;

pos(data)=storeData(data,dBlock)=data→dBlock,

其中,pos(data)表示data存储的首行起始位置。

4.针对数据块的增量数据,更新行占用索引;

firstLine→vLineIdx,vLineIdx∈dBlock

5.针对原始数据,更新数据记录索引;

updateDIdx(i,pos(data),len)→dIdx,dIdx∈dBlock

图4中展示了这一数据接入的过程。如图所示,其流程如下:

1.首先,获取原始数据data;

2.判断原始数据data的合法性;

3.若合法,则转步骤5,否则转步骤4;

4.返回数据不合法标识,结束;

5.计算data的长度len;

6.计算data写入数据块所需要的存储空间的大小needSpace;

7.获取当前数据存储页;

8.根据数据块占用索引获取当前数据存储页中第一个空闲数据块;

9.若空闲数据块存在,则转步骤10,否则转步骤13;

10.获取当前数据块的剩余存储空间freeSpace;

11.若freeSpace>=needSpace,则转步骤16,否则转步骤12;

12.获取下一个空闲数据块,转步骤9;

13.创建新的存储数据块;

14.更新数据块占用索引;

15.新建行占用索引文件和数据记录索引文件,转步骤17;

16.获取空闲行信息;

17.原始数据data映射成虚数据行列表List<vLine>;

18.虚数据行列表List<vLine>写入数据块;

19.实现数据写入的索引的维护;

20.返回数据成功写入标识;

21.结束。

二.数据写入的索引的维护

在数据增量的过程中,通过索引的维护,实现数据的高效管理。在数据写入的过程
中,需要维护的索引包括块占用索引、行占用索引以及数据记录索引。本发明通过对块占用
索引的维护,实现对数据块是否存在可用存储空间进行标记。在数据写入的过程中,通过对
行占用索引的读取,实现对于数据块中可用存储空间的定位。通过对数据记录索引的维护,
实现对数据记录在数据块中的存储位置记录。

2.1行占用索引的维护

在数据写入数据块后,首先执行行占用索引的维护,行占用索引的维护过程如图5
所示。如图所示,数据写入时的行占用索引维护的流程如下:

1.首先,获取当前数据记录写入数据块时占用的虚数据行的行号组成的数组num
[];

2.获取当前数据块的行占用索引vLineIdx;

3.令i=0;

4.判断i<num.size()?若是,则转步骤5,否则转步骤7;

5.更新vLineIdx中的第num[i]位,将其值置为1;

6.令i++,转步骤4;

7.数据写入的行占用索引过程结束。

2.2块占用索引的维护

数据写入的行占用索引维护完成后,执行块占用索引的维护。块占用索引的维护
过程如图6所示。如图所示,数据写入时的块占用索引维护过程如下:

1.首先,获取当前数据块的行占用索引;

2.扫描行占用索引;

3.若存在值为0的数据位,则转步骤4,否则转步骤5;

4.当前数据块存在未占用的虚数据行,不需要更新块占用索引,转步骤8;

5.当前数据块不存在未占用的虚数据行;

6.获取当前数据块的块占用索引;

7.将表示当前数据块存储状态的数据位的值置为0;

8.结束。

2.3数据记录索引的维护

数据写入的块占用索引维护完成后,执行数据记录索引的维护。数据记录索引的
维护过程如图7所示。如图所示,数据写入时的数据记录索引维护过程如下:

1.首先,获取当前数据块的数据记录索引;

2.获取当前数据记录的行号i;

3.获取当前数据记录的存储位置pos(data);

4.获取当前数据记录的长度len(data);

5.获取当前数据块的数据记录索引;

6.更新数据记录索引(i,pos(data),len(data));

7.结束。

三.数据变更

在数据增量过程中,数据变更包含删除数据和写入数据操作。删除数据操作通过
对原有的数据存储空间进行回收,实现数据的删除操作。删除操作并不实际执行磁盘存储
空间的清空,而是在新的数据写入的过程中,实现存储空间的覆盖性写入。这种做法极大的
提高了数据操作的运行效率。

3.1删除数据,存储空间回收

在数据删除的过程中,根据数据记录索引定位数据记录的实际存储位置。从数据
块中获取虚数据行的信息,将该数据记录的所有虚数据行占用索引置为0,并实现数据记录
索引的更新。同时,检测该数据块占用索引的值,若为非空闲,则置为空闲。这一过程如下:

1.根据行号i,从数据记录索引中查询行号为i的索引(i,loc,len);

2.从数据记录索引中清除该条索引的记录;

3.以loc的值作为入口,从数据块中定位该数据记录的所有虚行数据信息;

curVLine=get(loc),nextVLine=get(curLine.next)

首先根据loc的值获取第一个虚数据行,若当前数据行的next预留位不为null,则
以next作为指针获取下一个虚数据行信息,直至next为null。

4.将所有的虚行数据的行占用索引置为0;

vLine→0

5.检测块占用索引,若为非空闲状态,则更新为空闲状态;

dBlock→1

图8中展示了删除数据的基本流程。如图所示,这一过程如下:

1.首先,获取待删除数据的行号i;

2.查询数据记录索引,获取索引(i,loc,len);

3.在数据记录索引中删除该条索引;

4.获取loc指向的虚数据行curVLine=get(loc);

5.令j=0,num[j++]=i;

6.判断curVLine==null?若是,则转步骤9,否则转步骤7;

7.获取下一虚数据行curVLine=get(curVLine.next);

8.记录当前行号num[j++],转步骤6;

9.获取当前数据块的行占用索引;

10.将num中所有行在行占用索引中表示的占用状态的值置为0;

11.检测当前数据块的块占用索引;

12.若块占用索引的状态值为0,则转步骤13,否则转步骤14;

13.将块占用索引的值置为1;

14.结束。

3.2写入数据

在本例中,虚行数据实际存储的原始数据的最大长度为249字节,因此,在数据增
量过程中,根据原始数据的长度是否大于249字节,数据的写入过程将按照不同的流程实
现。其流程如下:

3.2.1数据长度<=249字节

在数据增量过程中,若原始数据的长度小于等于249字节,则原始数据可以映射成
一条虚数据行,其实现过程如下:

1.根据行占用索引,获取第一个空闲行

firstFreeLine=getFirstFreeLine(dBlock)

2.原始数据data映射成虚数据行vLine

vLine=data→vLine;

3.vLine写入数据块

vLine→dBlock

4.更新行占用索引

fistFreeLine→1

5.检测当前数据块的行占用索引,若全部行被占用,则更新块占用索引为非空闲
数据块

dBlockFreeIdx=dBlock→0

6.数据记录索引维护

图9中展示了原始数据长度小于等于249字节的数据写入的基本流程。如图所示,
这一过程如下:

1.首先,从当前数据块中获取第一个空闲行firstFreeLine;

2.根据行号获取行首位置head;

3.获取原始数据长度length,在此过程中,curLength=length;

4.原始数据data映射成vLine,其映射规则为vLine=

vLine(1,head,length,curLength,null,data);

5.vLine写入数据块;

6.更新firstFreeLine的行占用索引,将当前行占用索引置为已占用;

7.判断当前数据块是否仍存在空闲行,若存在,转步骤9,否则转步骤8;

8.更新块占用索引,将当前数据存储块置为非空闲状态;

9.数据记录索引维护,维护过程详见【2、数据写入的索引维护】部分;

10.结束。

3.2.2数据长度>249字节

在数据增量过程中,若原始数据的长度大于249字节,则原始数据可以映射成多条
虚数据行,其实现过程如下:

1.首先,计算原始数据映射的虚数据行的数量


2.根据行占用索引,获取前num个空闲行

freeLines=getFreeLines(num)

3.原始数据data映射成虚数据行vLines

vLines=(data,freeLines)→vLines;

4.vLines写入数据块

vLines→dBlock

5.更新行占用索引

freeLines→1

6.检测当前数据块的行占用索引,若全部行被占用,则更新块占用索引为非空闲
数据块

dBlockFreeIdx=dBlock→0

7.数据记录索引维护

图10中展示了原始数据长度大于249字节的数据写入的基本流程。如图所示,这一
过程如下:

1.首先,计算原始数据data的长度length;

2.计算原始数据data映射的虚数据行的数量num;

3.根据行占用索引,获取前num个空闲行freeLines;

4.计算空闲行的其实位置heads;

5.原始数据data中截取第0至249的字节流content;

6.映射第1行vLine,vLine[0]=vLine(1,heads[0],length,249,heads[1],
content);

7.令i=1;

8.i<(num-1)?若是,则转步骤9,否则转步骤12;

9.原始数据data中截取第i*249+1至(i+1)*249的字节流content;

10.映射第i+1行vLine,

vline[i]=vLine(0,heads[0],length,249,heads[i+1],content);

11.i++,转步骤8;

12.原始数据data中截取第i*249+1至末尾的字节流content;

13.获取字节流content的长度curLength;

14.映射最后一行vLine,

vLine[i]=vLine(0,heads[0],length,curLength,null,content);

15.更新行占用索引,将freeLines置为已占用;

16.判断当前数据块是否存在空闲行?若存在,则转步骤18,否则转步骤17;

17.块占用索引维护,将当前数据块状态置为非空闲;

18.数据记录索引维护;

19.结束。

四.数据提取

在数据提取的过程中,根据数据记录的行号匹配,实现数据记录索引的提取,并根
据数据记录索引的信息,实现数据记录的定位。数据块中的存储的数据记录可能分布在连
续或不连续的虚数据行中,以数据记录索引中记录的loc值作为数据记录提取的入口,最终
实现数据记录的提取过程。这一过程由以下几个步骤完成:

1.首先,根据数据记录的行号i进行匹配,从数据记录索引中提取出数据记录索引
(i,loc,length);

2.以loc值作为数据提取的入口,实现虚数据行的提取;

3.自虚数据行中提取并封装出原始数据记录data;

4.计算获取的数据记录data的长度,并和len的值进行比较,若两者相等,则返回
data,数据提取流程结束;若两者不等,则返回数据提取错误标识,数据提取流程结束。

图11中展示了数据提取的基本流程。如图所示,数据记录的提取流程描述如下:

1.首先,获取数据记录行号i;

2.根据i从数据记录索引中提取(i,loc,len)索引;

3.以loc为入口,提取数据块中起始位置为loc的虚数据行vLine;

4.记res=vLine.content;

5.判断vLine.next==null?若是,则转步骤8,否则转步骤6;

6.获取起始位置为vLine.next的vLine;

7.res+=vLine.content,转步骤5;

8.计算res的长度len(res);

9.判断len(res)==len?若是,则转步骤10,否则转步骤11;

10.返回res即为所求数据记录,转步骤12;

11.返回数据提取错误标识;

12.结束。

结合以上手段,本发明提出一种面向非结构化数据的高性能的非结构化数据存储
与索引技术,该技术适用于海云协同工作平台操作行为数据的高效存取和修改的需求。经
过测试表明,本发明提出的技术相对于传统的关系数据库和非结构化数据库在查询上性能
提升19%,空间利用率提高8%,数据更新效率提高50%。

以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术
人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本
发明的保护范围应以权利要求书所述为准。

一种面向云数据库的非结构化数据的存储与管理方法.pdf_第1页
第1页 / 共22页
一种面向云数据库的非结构化数据的存储与管理方法.pdf_第2页
第2页 / 共22页
一种面向云数据库的非结构化数据的存储与管理方法.pdf_第3页
第3页 / 共22页
点击查看更多>>
资源描述

《一种面向云数据库的非结构化数据的存储与管理方法.pdf》由会员分享,可在线阅读,更多相关《一种面向云数据库的非结构化数据的存储与管理方法.pdf(22页珍藏版)》请在专利查询网上搜索。

本发明属于非结构化云存储管理研究与应用领域,具体涉及一种面向云数据库的非结构化数据存储与管理方法。针对云环境中,以json数据为代表的非结构话数据底层存储特点,本发明基于虚拟分块的方式实现非定长数据记录的分割与基本存储,通过虚拟分块的链表关系实现数据记录的排序与提取。同时,为存储分块建立索引,实现存储空间的碎片回收与数据记录的倒排索引。通过本发明的数据存储管理技术,可以有效满足海量、非结构化数据应。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1