一种数据存储与查询的方法、系统及存储引擎装置制造方法

文档序号:6512964阅读:183来源:国知局
一种数据存储与查询的方法、系统及存储引擎装置制造方法
【专利摘要】本发明公开了一种数据存储与查询的方法,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;其中,数据存储方法包括:将接收到的原始数据文件按相似特征(如手机号段)划分成多个子数据文件;依次读取子数据文件中的每条数据,根据每条数据中的信息生成与所述每条数据对应的索引身份标识号码(ID),并根据所述索引ID查询索引树,获取与所述索引ID对应的数据块号,并将所述每条数据逐条存储到相应的数据块中。本发明还同时公开了一种数据存储与查询的系统及存储引擎装置。采用本发明,节约了大量的存储空间,降低了数据读取时计算机内存与外部存储的输入输出(IO)量。
【专利说明】一种数据存储与查询的方法、系统及存储引擎装置

【技术领域】
[0001]本发明涉及通信及计算机领域数据存储技术,尤其涉及一种数据存储与查询的方法、系统及存储引擎装置。

【背景技术】
[0002]目前,存储数据可以采用数据库、文件系统等方式,在现有的数据存储方式中,数据是存储在数据库或文件系统划分的数据块中的。数据在存入数据块时,通过相关的存储管理算法实现存储,且数据记录是按行随机存放的,查询时通过构造的索引进行查询。以数据库为例,数据库的相关逻辑结构如图1所示,显然,在图1中,数据是按行存储的,索引中存储了行身份标识号码(ID,Identity),其中,所述行ID是唯一标志记录物理位置的ID。在进行常规表访问时,通过从索引里面找到的记录的行ID去查表,进而找到所要查找的数据。
[0003]但是,由于现有的数据存储方法使每个数据块中存储的数据是无规律的,因此,至少存在以下问题:
[0004]1、相似的数据存储于不同的数据块中。比如,一个用户某月的通用无线分组业务(General Packet Rad1 Service,GPRS)话单存储在多个数据块中,会造成块级数据冗余,消耗大量的存储空间;即使采用Oracle数据库的块级压缩技术进行去冗,也会因相似的数据存储在不同的块中而导致数据去冗率大大低于传统的数据字典去冗方法,海量数据消耗的存储空间依然巨大。
[0005]2、现有数据库或文件系统的存储结构影响了查询性能。如果进行多行数据的查询,则需要将存储相关数据的数据块全部找出;如查询1000条数据记录,最坏的情况下需要读取1000个数据块进行解析,这大大增加了系统的输入/输出(Input/Output,10)量。


【发明内容】

[0006]有鉴于此,本发明实施例的主要目的在于提供一种数据存储与查询的方法、系统及存储引擎装置,能节约大量的存储空间,降低数据读取时的1量。
[0007]为达到上述目的,本发明的技术方案是这样实现的:
[0008]本发明提供了一种数据存储方法,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;所述方法还包括:
[0009]将接收到的原始数据文件划分成多个子数据文件;
[0010]依次读取子数据文件中的每条数据,根据每条数据中的信息生成与所述每条数据对应的索引身份标识号码ID,并根据所述索引ID查询索引树,获取与所述索引ID对应的数据块号,并将所述每条数据逐条存储到相应的数据块中。
[0011]优选地,所述索引块头中至少存储有数据块记录开始地址、数据块记录结束地址、以及数据块前映像地址;
[0012]所述索引块本体包括第一信息、第二信息、第二信息标识、开始数据块号和结束数据块号。
[0013]优选地,所述至少一个压缩槽对应一个压缩值段;在所述数据块头中还设置有存储下一个数据块地址的存储槽;
[0014]其中,所述压缩槽至少包括字段标识、字段长度和压缩值偏移地址;所述压缩值段用于存储所述至少一个压缩槽所对应的具体字段内容。
[0015]优选地,所述根据每条数据中的信息生成与所述每条数据对应的索引ID为:根据所述每条数据的第一信息和/或第二信息生成索引ID ;
[0016]所述将每条数据逐条存储到相应的数据块中包括:判断所述数据块是否有可用存储空间,如果有可用存储空间,则将所述每条数据存储到所述数据块中;如果没有可用存储空间,则将所述每条数据存储到新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并将索引块中存储的地址更新为指向新分配的数据块。
[0017]优选地,将所述每条数据存储到所述数据块中,包括:
[0018]判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则将所述当前字段值存储到压缩槽中,并将当前字段值存储为相关压缩值的指针;如果没有,则直接进行存储。
[0019]优选地,所述方法还包括:
[0020]在数据块中有未占用的压缩槽时,将重复率大于设定阈值的字段存储到压缩槽中。
[0021]本发明还提供了一种数据查询方法,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;所述方法还包括:
[0022]接收到查询指示时,根据索引ID定位所述索引ID对应的开始数据块号,依次读取开始数据块号至结束数据块号的数据。
[0023]优选地,所述索引块头中至少存储有数据块记录开始地址、数据块记录结束地址、以及数据块前映像地址;
[0024]所述索引块本体包括第一信息、第二信息、第二信息标识、开始数据块号和结束数据块号。
[0025]优选地,所述至少一个压缩槽对应一个压缩值段;在所述数据块头中还设置有存储下一个数据块地址的存储槽;
[0026]其中,所述压缩槽至少包括字段标识、字段长度和压缩值偏移地址;所述压缩值段用于存储所述至少一个压缩槽所对应的具体字段内容。
[0027]优选地,所述方法还包括:
[0028]在索引块或数据块处于修改状态时,接收到查询指示后,读取相应的数据块前映像地址对应的数据。
[0029]本发明还提供了一种存储引擎装置,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;所述存储引擎装置包括读取模块、获取模块、存储模块;其中,
[0030]所述读取模块,用于依次读取子数据文件中的每条数据;
[0031]所述获取模块,用于根据生成的索引ID查询索引树,获取与所述索引ID对应的数据块号;
[0032]所述存储模块,用于将所述每条数据逐条存储到相应的数据块中。
[0033]优选地,所述存储引擎装置还包括索引ID生成模块和判定模块;其中,
[0034]所述索引ID生成模块,用于根据所述每条数据中的信息生成索引ID ;
[0035]所述判定模块,用于判断所述数据块是否有可用存储空间;如果有可用存储空间,判定将所述每条数据存储到所述数据块中;如果没有可用存储空间,判定将所述每条数据存储到新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并将索引块中存储的地址更新为指向新分配的数据块。
[0036]优选地,所述判定模块,还用于在判定将所述每条数据存储到所述数据块中时,判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则判定将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则判定将所述当前字段值存储到压缩槽中,并将当前字段值存储为相关压缩值的指针;如果没有,则判定直接进行存储。
[0037]优选地,所述存储模块,还用于在数据块中有未占用的压缩槽时,将重复率大于设定阈值的字段存储到压缩槽中。
[0038]本发明还提供了一种数据存储与查询的系统,所述系统包括拆分装置、存储引擎装置和查询引擎装置;其中,
[0039]所述存储引擎装置为上文所述的存储引擎装置;
[0040]所述拆分装置,用于将接收到的原始数据文件划分成多个子数据文件;
[0041]所述查询引擎装置,用于接收到查询指示时,根据索引ID定位与所述索引ID对应的开始数据块号,依次读取开始数据块号至结束数据块号的数据;在索引块或数据块处于修改状态时,接收到查询指示后,读取相应的数据块前映像地址对应的数据。
[0042]本发明实施例所提供的数据存储与查询的方法、系统及存储引擎装置,通过设计有效的索引块存储结构、特定格式的数据块存储结构,能有序、高效地存储数据和压缩数据,节约了大量的存储空间,同时实现了随机查询数据功能,降低了数据读取时的1量。另外,可以采用常规的压缩算法进一步压缩所存储的数据,如此,在中央处理器(CentralProcessing Unit, CPU)资源比较充足的情况下还可以进一步降低1量,节约更多存储空间。
[0043]此外,本发明实施例尤其适用于对海量数据的存储和查询,比如:GPRS话单、语音话单、短信话单、彩信话单、公积金清单等等,该类数据主要特点为随机存入、顺序读取、主要提供查询服务。

【专利附图】

【附图说明】
[0044]图1为现有技术中数据库的相关逻辑结构示意图;
[0045]图2为本发明实施例索引树及索引块结构示意图;
[0046]图3为本发明实施例数据块结构示意图;
[0047]图4为本发明实施例存储目录结构示意图;
[0048]图5为本发明实施例存储引擎装置的组成结构示意图;
[0049]图6为本发明实施例数据存储与查询系统的组成结构示意图;
[0050]图7为本发明实施例数据存储与查询系统的具体工作流程示意图;
[0051]图8为本发明实施例存储引擎装置处理流程示意图;
[0052]图9为本发明实施例查询引擎装置处理流程示意图;
[0053]图10为本发明实施例查询某用户号码的示意图。

【具体实施方式】
[0054]下面结合附图及具体实施例对本发明作进一步详细的说明。
[0055]本发明实施例提供了一种索引块存储结构,索引块包括索引块头和索引块本体;其中,在索引块头中至少存储有数据块记录开始地址、数据块记录结束地址、以及数据块前映像地址;所述索引块本体包括第一信息、第二信息、第二信息标识、开始数据块号和结束数据块号。
[0056]这里,所述索引块的大小可根据实际需要设定,但必须为操作系统数据块的整数倍;比如,所述索引块的大小可以为64k。
[0057]这里,以存储GPRS话单为例,此时,所述第一信息为用户号码,所述第二信息为账期。
[0058]图2为本发明实施例索引树及索引块存储结构示意图,如图2所示,所述索引记录格式包括用户号码、账期、账期标识、开始块号和结束块号;其中,
[0059]所述账期标识主要用于标志是否为当前月;开始块号用于记录该用户号码当前账期开始数据记录的存储块地址;结束块号用于记录该用户号码当前账期最后数据记录的存储块地址。
[0060]优选的,上述用户号码、账期、账期标识、开始块号和结束块号的字段均为定长。
[0061]优选的,在索引块头中存储有至少下述信息:数据块记录开始地址、数据块记录结束地址、以及数据块前映像地址。
[0062]在图2中,索引树以1522534xxxx号段为例,该号段有10000个用户号码,当然,在索引树的根节点上还有全号段的索引。
[0063]具体的,图2中的10000个用户号码分为两组进行存储:0000?5000为第一组,5001?10000为第二组。所述0000?5000又细分为50个小组,且每100个号段为一个小组,如:0000 ?0100,0101 ?0200、...,4501 ?5000。
[0064]采用本发明实施例所述的索引块记录格式,在对话单进行存入时,只需以当前月为索引进行数据存储。具体存储过程可参见图8所示的流程,在此不再赘述。
[0065]本发明实施例还提供了一种数据块存储结构,所述数据块包括数据块头和数据记录块;其中,所述数据记录块用于存储未经压缩的数据。
[0066]具体的,数据块头中预留有至少一个压缩槽;所述压缩槽至少包括字段标识、字段长度和压缩值偏移地址;并且,所述至少一个压缩槽对应一个压缩值段,所述压缩值段用于存储所述至少一个压缩槽所对应的具体字段内容。
[0067]优选的,当一个数据块中的压缩槽已满、但压缩值段还有空间可以存储数据时,或压缩值段已满而有压缩槽剩余时,后续数据都将不再进行压缩存储。
[0068]这里,压缩槽数量可以在数据块初始化时根据实际情况进行设定。
[0069]另外,在所述数据块头中还设置有存储下一个数据块地址的存储槽。其中,在最后一个数据块中,所述下一个数据块的地址为空。
[0070]采用上述数据块存储结构,不仅能够节省大量存储空间,也相当于对数据进行了高效的压缩。
[0071]比如,某字段占500个字节,第一次存储该字段时,将该字段的字段标识、字段长度和压缩值偏移地址写入压缩槽中,并将该字段的具体内容写入压缩值段中;待以后再次出现该字段时,只需在数据块的数据记录块中存储该字段的地址即可,而每个地址一般只需占2个字节。采用本发明实施例所述方法存储100个500字节的字段时,总共需要占用700个字节;而采用常规方法进行存储时,需占用500X100=50000个字节。
[0072]图3为本发明实施例数据块存储结构示意图,如图3所示,所述压缩槽包括有字段标识、字段长度和压缩值偏移地址。显然,在图3中有两个压缩槽,该数据块包括数据记录块和两个压缩槽。
[0073]这里,所述压缩槽用于记录重复值在数据块内的存储地址、长度及标识号。
[0074]优选的,每个数据块存储有指向下一个数据块的地址;其中,在最后一个数据块中,所述下一个数据块的地址为空。
[0075]优选的,一个字段可以对应多个压缩槽,从而可以存储一个列中的多种重复出现的值。如果同一个数据块存储的是同一号码的数据,重复的数据概率将大大提高,压缩的比率也将提高。比如:话单中的国际移动用户识别码(Internat1nal Mobile SubscriberIdentificat1n, IMSI)字段,由于同一个号码的MSI完全相同,所以只需占用一个压缩槽。再比如:话单中存在接入点字段时,当所有号码的接入点为CMWAP、CMNET时,需占用两个压缩槽,一个压缩槽用来存储CMWAP,另一压缩槽用来存储CMNET。这里,所述CMWAP和CMNET是中国移动用户常用的接入GPRS网络的两种方式。
[0076]图4为本发明实施例存储目录结构示意图,如图4所示,每个号段对应一个目录,每个目录下可设置有多个文件,用于存储每月的话单数据。
[0077]这里,所述每个目录下所设置的文件数可根据实际需要进行设定。所述存储目录的底层可依托与Linux文件系统。
[0078]比如,在图7中,15222534号段对应一个目录,该目录下设置有6个文件,如1522534_01、1522534_02、...、1522534_06,所述6个文件分别对应6个月内该号段号码的话单。
[0079]如果在线查询的账期时间更长,可以存储更多的账期文件,比如,可建立12个文件,对该号段的I?12月的话单均进行记录。
[0080]在上述索引块存储结构、数据块存储结构的基础上,本发明实施例提供了一种数据存储方法,所述方法包括:
[0081]将接收到的原始数据文件划分成多个子数据文件;
[0082]依次读取子数据文件中的每条数据,根据每条数据中的信息生成与所述每条数据对应的索引ID,并根据所述索引ID查询索引树,获取与所述索引ID对应的数据块号,并将所述每条数据逐条存储到相应的数据块中,以使相似数据存储在逻辑上连续的数据块链中。
[0083]具体的,接收到原始数据文件后,可按类别将所述原始数据文件划分成多个子数据文件。比如,原始数据文件为原始话单文件时,可按照号段将原始话单文件拆分成多个号段话单文件。
[0084]这里,收到原始数据文件后,也可以按某类相似特性将所述原始数据文件划分成多个子数据文件。比如,所述某类相似特性可以为手机号段。
[0085]这里,根据每条数据中的信息生成与所述每条数据对应的索引ID为:根据所述每条数据的第一信息和/或第二信息生成索引ID ;
[0086]其中,所述每条数据中均包含有各类信息,如:用户号码、账期、业务费用等信息;所述第一信息、第二信息分别为每条数据中包含的某种信息,相应的,所述生成索引ID为直接将某种信息作为索引ID、或将信息的组合作为索引ID。举例来说,在存储用户话单文件时,每条数据中都包含有用户号码、账期、各业务费用等信息,那么,当第一信息为用户号码、第二信息为账期时,根据所述每条数据的第一信息和第二信息生成的索引ID为两个信息的组合,也就是说,索引ID为“用户号码+账期”。
[0087]这里,所述将每条数据逐条存储到相应的数据块中包括:判断该数据块是否有可用存储空间,如果有可用存储空间,则将所述每条数据存储到该数据块中;如果没有可用存储空间,则将所述每条数据存储到新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并将索引块中存储的地址更新为指向新分配的数据块。
[0088]具体的,所述将所述每条数据存储到该数据块中,包括:判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则将所述当前字段值存储到压缩槽中,并将当前字段值存储为相关压缩值的指针;如果没有,则直接进行存储。
[0089]优选的,所述方法还包括:在数据块中有未占用的压缩槽时,将重复率大于设定阈值的字段存储到压缩槽中。
[0090]在上述索引块存储结构、数据块存储结构的基础上,本发明实施例还提供了一种数据查询方法,所述方法包括:
[0091]接收到查询指示时,根据索引ID定位该索引ID对应的开始数据块号,依次读取开始数据块号至结束数据块号的数据。
[0092]优选的,所述方法还包括:在索引块或数据块处于修改状态时,接收到查询指示后,读取相应的数据块前映像地址对应的数据。
[0093]优选的,所述方法还包括:未找到该索引ID对应的开始数据块号时,返回查询失败消息。
[0094]在上文所述索引块存储结构、数据块存储结构的基础上,本发明还提出了一种存储引擎装置、以及一种存储与查询的系统。
[0095]图5为本发明实施例存储引擎装置的组成结构示意图,如图5所示,所述存储引擎装置包括读取模块51、获取模块52、存储模块53 ;其中,
[0096]所述读取模块51,用于依次读取子数据文件中的每条数据;
[0097]所述获取模块52,用于根据生成的索引ID查询索引树,获取与所述索引ID对应的数据块号;
[0098]所述存储模块53,用于将所述每条数据逐条存储到相应的数据块中。
[0099]优选的,所述存储引擎装置还包括索引ID生成模块54和判定模块55 ;其中,
[0100]所述索引ID生成模块54,用于根据所述每条数据中的信息生成索引ID ;
[0101]所述判定模块55,用于判断该数据块是否有可用存储空间,如果有可用存储空间,则判定将所述每条数据存储到该数据块中;如果没有可用存储空间,则判定将所述每条数据存储到新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并将索引块中存储的地址更新为指向新分配的数据块。
[0102]优选的,所述判定模块55,还用于在判定将所述每条数据存储到该数据块中时,判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则判定将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则判定将所述当前字段值存储到压缩槽中,并将当前字段值存储为相关压缩值的指针;如果没有,则判定直接进行存储。
[0103]具体的,所述索引ID生成模块54,具体用于根据所述每条数据的第一信息和/或第二信息生成索引ID。
[0104]实际应用中,所述读取模块51、获取模块52、索引ID生成模块54、判定模块55可由数据库所属终端中的中央处理器(CPU, Central Processing Unit)、微处理器(MPU,Micro Processor Unit)、数字信号处理器(DSP, Digital Signal Processor)或现场可编程门阵列(FPGA, Field Programmable Gate Array)实现;
[0105]所述存储模块53可由数据库所属终端中的存储介质实现,比如:各种类型的存储器。
[0106]图6为本发明实施例数据压缩、存储与查询系统的组成结构示意图,如图6所示,所述系统包括:拆分装置61、存储引擎装置62和查询引擎装置63 ;其中,
[0107]所述拆分装置61,用于接收到原始数据文件后,将所述原始数据文件分成多个子数据文件;
[0108]所述存储引擎装置62,用于对所述多个子数据文件进行存储;
[0109]所述查询引擎装置63,用于接收到查询指示时,根据索引ID定位该索引ID对应的开始数据块号,依次读取开始数据块号至结束数据块号的数据。
[0110]这里,所述存储引擎装置62的具体的组成结构如图5所示。
[0111]图7示出了所述系统的工作流程示意图,在进行原始话单数据文件存储时,拆分装置将所述原始话单数据拆分为多个号段话单文件,存储引擎装置查询压缩配置表,并根据索引树结构分别对各个号段话单文件进行存储,所述存储过程如图7中标号I?6所示流程;在进行话单数据查询时,查询引擎装置根据查询条件生成索引ID,并查询索引树结构,然后从存储文件中进行数据查询,所述查询过程如图7中标号7?8所示流程。
[0112]下面以存储、查询用户话单文件为例,来说明图6所述系统的工作流程。具体的,该流程包括以下步骤:
[0113]a)、拆分装置读取原始话单文件后,根据号段将所述原始话单文件拆分成多个号段话单文件,并将所述多个号段话单文件发送至存储引擎装置进行处理。
[0114]这里,拆分的目的主要是为了实现多个存储引擎装置的并行处理,以避免多个存储引擎装置同时对同一个号码的数据进行处理而导致块内数据存储内容遭到不一致破坏进而造成存储数据损坏。
[0115]b)、存储引擎装置按条读取号段话单文件中的数据,通过号码+账期,生成索引ID并查询索引树,在索引叶节点获取该条话单的当前号码、当前账期的数据块号,然后判断该数据块是否有可用空间,如果有可用空间,则将数据存入该数据块中;如果无可用空间时,则调用操作系统函数分配空数据块并初始化为指定格式,并在当前数据块的下一(next)块指针中写入新分配的数据块号,同时根据新分配的数据块号修改索引块中的记录信息,完成上述操作后将数据存入新数据块。
[0116]具体的,在存入数据时,判断该数据块是否有可用存储空间,如果有可用存储空间,则判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则将所述当前字段值存储到压缩槽中,将所述当前字段值存储为相关压缩值的指针;如果没有,则直接进行存储。如果没有可用存储空间,则将数据写入新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并修改索引块头中存储的地址。
[0117]这里,可将重复率高于设定阈值的字段存储在压缩槽中,如此,有效提高了块压缩率。
[0118]举例来说,某数据块有三个压缩槽:压缩槽1、压缩槽2、压缩槽3 ;其中,在压缩槽I中,已存储数据a的压缩值偏移地址和字段长度;在压缩槽2中,已存储数据b的压缩值偏移地址和字段长度。当有数据a、b、C、C、d写入时,可在数据记录中直接写入数据a的压缩值偏移地址、数据b的压缩值偏移地址;若压缩槽3尚未写入字段时,由于数据c的重复率大于数据d的重复率,可在压缩槽3中填写数据c的字段标识、压缩值偏移地址和字段长度,并将数据c写入压缩值段中,在对第二个数据c进行存储时,在数据记录中写入数据c的压缩值偏移地址;由于该数据块中只有三个压缩槽,三个压缩槽均已被占用,只能将数据d写入数据记录中。
[0119]此外,存储引擎装置还用于进行账期切换,如果当前号码的账期无法在索引中定位,则建立新的账期文件,分配格式化的数据块,并对最远账期的索引指针进行修改,指向新建的账期文件中的数据块;这里,存储引擎装置在进行索引块和数据块修改时,均拷贝相关数据块的前映像,以供查询时即时读取数据。
[0120]图8为本发明实施例存储引擎装置处理流程示意图,如图8所示,所述存储引擎装置处理流程包括以下步骤:
[0121]步骤801:存储引擎装置接收到拆分装置提供的号段话单文件;
[0122]假设某一时间产生一批话单数据,需要对这批话单数据进行存储,拆分装置根据号段将这批话单数据拆分成多个号段话单文件。
[0123]步骤802:从索引中查找当前号码的当前月指针,如果查找到,执行步骤803,如果没有查找到,执行步骤809 ;
[0124]这里,所述号码为该存储引擎装置对应的号段中的号码。
[0125]步骤803:判断该当前号码的索引结束指针指向的数据块是否已满,如果已满,执行步骤811,如果未满,执行步骤804 ;
[0126]这里,判断数据块是否已满,即判断数据块是否有可用存储空间。
[0127]步骤804:判断当前存入数据是否与压缩槽对应字段数据相等,如果是,执行步骤810,如果否,执行步骤805 ;
[0128]步骤805:判断是否有未占用的压缩槽,如果没有,执行步骤807 ;如果有,执行步骤 806 ;
[0129]步骤806:判断压缩值段是否有剩余空间,如果没有,执行步骤807,否则,执行步骤 808 ;
[0130]步骤807:不对数据进行压缩,在数据记录块中直接写入数据,然后进入步骤812 ;
[0131]步骤808:将未占用的压缩槽修改为当前值,在数据记录块中写入指向压缩值的指针,拷贝数据块前映像,写入数据,清除数据块前映像;然后进入步骤812 ;
[0132]这里,为了确保查询引擎装置能够实时查询数据,在进行数据块或索引块修改时,需拷贝数据前映像。
[0133]步骤809:按当月时间建立当月文件,修改最远账期的索引指针指向新分配数据块;然后执彳了步骤810 ;
[0134]步骤810:在数据记录块中写入当前数据对应的压缩值的指针,拷贝数据块前映像,写入数据,清除数据块前映像;然后进入步骤812 ;
[0135]步骤811:调用操作系统函数分配新数据块并初始化,修改当前数据块及索引块指针指向新数据块,拷贝数据块前映像,写入数据,清除数据块前映像;然后进入步骤812 ;
[0136]步骤812:存储结束。
[0137]C)、查询引擎装置通过号码+账期的查询条件定位到该号码的开始数据块号,并依次读取数据串至结束数据块号,然后返回所读取的数据。
[0138]具体的,若查询引擎装置在查询时,存储引擎装置正在修改数据块或索引块,则查询引擎装置读取相关数据块的前映像。
[0139]图9为本发明实施例查询引擎装置处理流程示意图,如图9所示,所述查询引擎装置处理流程包括以下步骤:
[0140]步骤901:根据号码及账期从索引树中定位数据块开始指针;然后进入步骤902 ;
[0141]步骤902:判断是否找到数据,如果找到数据,执行步骤903,如果未找到,执行步骤 905 ;
[0142]步骤903:读取该号码对应账期的开始指针至结束指针的数据;然后,执行步骤904 ;
[0143]步骤904:返回所读取的数据,结束当前处理流程;
[0144]也就是说,返回用户查询的账单。
[0145]步骤905:返回查询失败消息。
[0146]也就是说,在所述查询引擎装置未找到用户查询的账单时,会返回查询失败信息消息。
[0147]图10示出了查询某用户号码话单的示意图,如图10所示,当查询号码为1525340001的I?6月份的话单时,根据(1525340001) + (I?6)从索引树中找到数据块开始指针以及结束指针,然后读取所述开始指针至结束指针的数据,即可查询出号码为1525340001的I?6月份的详细话单。
[0148]d)、如果需要增加号段,则采用二叉数相关算法,由索引维护进程完成索引树的节点构建及相关号段数据文件的建立。
[0149]e)、对于已存储的数据,如需要进行修改,存储引擎装置先对原始文件进行删除,然后再进行插入操作。
[0150]这里,先对原始文件进行删除,然后再进行插入操作,将会导致部分数据块存在碎片。因此,可以在系统维护期间进行碎片整理,以提升系统性能。
[0151]通过上述技术方案,通过对相似数据进行分拆归类,存储引擎装置检索数据分布,实时动态地把相似的数据顺序存储在同一个数据块中或连续的数据块中,节省了大量的存储空间;同时减少了查询时的1量,使得在查询类应用中数据的存储使用量大幅下降,同时查询效率大幅提升。并且,在CPU资源比较充足的情况下还可以采用常规压缩算法进一步压缩降低1量,节约更多存储空间。
[0152]以GPRS话单数据为例,对于一个8k的数据块来说,按常规方法只能存储50至60条GPRS话单数据,而采用本发明所述技术方案,可以存储120至180条GPRS话单数据;采用常规方法读取一个300条的GPRS话单时,最坏情况要读300个数据块,而采用本发明所述技术方案,最坏情况只需读取3个数据块。
[0153]以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
【权利要求】
1.一种数据存储方法,其特征在于,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;所述方法还包括: 将接收到的原始数据文件划分成多个子数据文件; 依次读取子数据文件中的每条数据,根据每条数据中的信息生成与所述每条数据对应的索引身份标识号码ID,并根据所述索引ID查询索引树,获取与所述索引ID对应的数据块号,并将所述每条数据逐条存储到相应的数据块中。
2.根据权利要求1所述的方法,其特征在于,所述索引块头中至少存储有数据块记录开始地址、数据块记录结束地址、以及数据块前映像地址; 所述索引块本体包括第一信息、第二信息、第二信息标识、开始数据块号和结束数据块号。
3.根据权利要求1所述的方法,其特征在于,所述至少一个压缩槽对应一个压缩值段;在所述数据块头中还设置有存储下一个数据块地址的存储槽; 其中,所述压缩槽至少包括字段标识、字段长度和压缩值偏移地址;所述压缩值段用于存储所述至少一个压缩槽所对应的具体字段内容。
4.根据权利要求1至3任一项所述的方法,其特征在于,所述根据每条数据中的信息生成与所述每条数据对应的索引ID为:根据所述每条数据的第一信息和/或第二信息生成索引ID ; 所述将每条数据逐条存储到相应的数据块中包括:判断所述数据块是否有可用存储空间,如果有可用存储空间,则将所述每条数据存储到所述数据块中;如果没有可用存储空间,则将所述每条数据存储到新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并将索引块中存储的地址更新为指向新分配的数据块。
5.根据权利要求4所述的方法,其特征在于,将所述每条数据存储到所述数据块中,包括: 判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则将所述当前字段值存储到压缩槽中,并将当前字段值存储为相关压缩值的指针;如果没有,则直接进行存储。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括: 在数据块中有未占用的压缩槽时,将重复率大于设定阈值的字段存储到压缩槽中。
7.一种数据查询方法,其特征在于,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;所述方法还包括: 接收到查询指示时,根据索引ID定位所述索引ID对应的开始数据块号,依次读取开始数据块号至结束数据块号的数据。
8.根据权利要求7所述的方法,其特征在于,所述索引块头中至少存储有数据块记录开始地址、数据块记录结束地址、以及数据块前映像地址; 所述索引块本体包括第一信息、第二信息、第二信息标识、开始数据块号和结束数据块号。
9.根据权利要求7所述的方法,其特征在于,所述至少一个压缩槽对应一个压缩值段;在所述数据块头中还设置有存储下一个数据块地址的存储槽; 其中,所述压缩槽至少包括字段标识、字段长度和压缩值偏移地址;所述压缩值段用于存储所述至少一个压缩槽所对应的具体字段内容。
10.根据权利要求7至9任一项所述的方法,其特征在于,所述方法还包括: 在索引块或数据块处于修改状态时,接收到查询指示后,读取相应的数据块前映像地址对应的数据。
11.一种存储引擎装置,其特征在于,在数据块存储结构中,数据块头中预留有至少一个压缩槽;在索引块存储结构中,索引块包括索引块头和索引块本体;所述存储引擎装置包括读取模块、获取模块、存储模块;其中, 所述读取模块,用于依次读取子数据文件中的每条数据; 所述获取模块,用于根据生成的索引ID查询索引树,获取与所述索引ID对应的数据块号; 所述存储模块,用于将所述每条数据逐条存储到相应的数据块中。
12.根据权利要求11所述的存储引擎装置,其特征在于,所述存储引擎装置还包括索引ID生成模块和判定模块;其中, 所述索引ID生成模块,用于根据所述每条数据中的信息生成索引ID ; 所述判定模块,用于判断所述数据块是否有可用存储空间;如果有可用存储空间,判定将所述每条数据存储到所述数据块中;如果没有可用存储空间,判定将所述每条数据存储到新分配的数据块中,同时在当前数据块的存储槽中记录新分配的数据块地址,并将索引块中存储的地址更新为指向新分配的数据块。
13.根据权利要求12所述的存储引擎装置,其特征在于,所述判定模块,还用于在判定将所述每条数据存储到所述数据块中时,判断当前字段值是否等于压缩槽所对应的相关字段值,如果等于,则判定将所述当前字段值存储为相关压缩值的指针;如果不等于,则判断是否还有未占用的压缩槽,如果有,则判定将所述当前字段值存储到压缩槽中,并将当前字段值存储为相关压缩值的指针;如果没有,则判定直接进行存储。
14.根据权利要求11所述的存储引擎装置,其特征在于,所述存储模块,还用于在数据块中有未占用的压缩槽时,将重复率大于设定阈值的字段存储到压缩槽中。
15.一种数据存储与查询的系统,其特征在于,所述系统包括拆分装置、存储引擎装置和查询引擎装置;其中, 所述存储引擎装置为权11至权14任一项所述的存储引擎装置; 所述拆分装置,用于将接收到的原始数据文件划分成多个子数据文件; 所述查询引擎装置,用于接收到查询指示时,根据索引ID定位与所述索引ID对应的开始数据块号,依次读取开始数据块号至结束数据块号的数据;在索引块或数据块处于修改状态时,接收到查询指示后,读取相应的数据块前映像地址对应的数据。
【文档编号】G06F17/30GK104462141SQ201310439224
【公开日】2015年3月25日 申请日期:2013年9月24日 优先权日:2013年9月24日
【发明者】王凡, 陈乐君, 钟全龙, 谭正 申请人:中国移动通信集团重庆有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1