发明内容
本申请提供了一种数据储存方法,用以解决现有技术中查表服务内存空间受到限制的问题;
另一方面,本申请提供了一种数据搜索的方法,用以快速在上述储存的数据中进行数据搜索。
一方面,本申请通过本申请中实施例一,提供如下技术方案:
一种数据储存方法,所述方法包括如下步骤:
获取待储存的数据块,所述数据块中包含至少一个数据;
将所述数据块压缩为压缩数据块;
将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域,其中:所述第一数据结构包括第一有效数据域和第一数据指针域,所述第一有效数据域包括多个第一子数据域,每一个第一子数据域用于保存一个数据块中各个数据的数据关键字和压缩数据块,所述第一数据指针域用于保存检索数据时查找数据关键字的指针。
可选的,所述第一数据指针域包含N个子指针域,所述将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域时,还包括:
分别针对每一个数据进行如下操作:
在第一子数据域中,将每一个数据所在压缩数据块的指针以及数据在所述数据块中的编号和数据关键字关联保存;
将数据关键字的值对N取模,当该模值是第一次出现时,将数据关键字的指针作为查找相应模值对应的第一个数据的关键字指针保存到其中一个子指针域,否则,将数据关键字的指针和相邻最近上一次模值相等的数据的数据关键字,关联保存到所述相邻最近上一次模值相等的数据的数据关键字所保存的第一子数据域中。
可选的,所述第一数据结构还包括:头指针域,以及将所述数据块压缩为压缩数据块之前,还包括:
确认需要压缩所述待储存的数据块;以及
确认所述头指针域中包含压缩数据指示信息。
可选的,将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域之前,还包括:
对第一子数据域中除压缩数据块以外的部分进行压缩处理。
可选的,获取待储存的数据块和将所述数据块压缩为压缩数据块之间,还包括:
基于所述头指针域内的是否有剩余空间第一子数据域的指示信息,判断所述第一数据结构的第一有效数据域中存在数据压缩未饱和的第一子数据域时,则根据所述第一数据结构的头指针域内的未饱和压缩数据块在已经存有数据的最后一个第一子数据域中的位置指示信息,取出已经存入最后一个第一子数据域的压缩数据块并解压缩,将解压缩的数据合并入待存储的数据块。
可选的,确认不需要压缩所述数据块时,还包括:
将每一个数据的数据关键字和数据块存入第二数据结构的第二有效数据域的一个第二子数据域,其中:所述第二数据结构包括第二有效数据域和第二数据指针域,所述第二有效数据域包括多个第二子数据域,每一个第二子数据域用于保存一个数据块中各个数据的数据关键字和数据,所述第二数据指针域用于保存检索数据时查找数据关键字的指针。
可选的,所述第二数据指针域包含N个子指针域,所述将每一个数据的数据关键字存入第二数据结构的第二有效数据域的一个第二子数据域时,还包括:
将数据关键字的值对N取模,当该模值是第一次出现时,将数据关键字的指针作为查找相应模值对应的第一个数据的关键字指针保存到其中一个子指针域,否则,将数据关键字的指针和相邻最近上一次模值相等的数据的数据关键字关联保存。
可选的,所述第一数据结构和第二数据结构为hash表数据结构。
另一方面,本申请通过本申请中的实施例二提供如下技术方案:
一种查询使用实施例一方法存储的数据的方法,其特征在于,包括:
确定待查询数据的查询关键字;
基于在第一数据指针域保存的检索数据时查找数据关键字的指针,从第一有效数据域中的一个子数据域中,获取与所述查询关键字匹配的数据关键字,以及包含待查询数据的压缩数据块,解压所述压缩数据块,获得其中的待查询数据。
可选的,基于在第一数据指针域保存的检索数据时查找数据关键字的指针,从第一有效数据域中的一个子数据域中,获取与所述查询关键字匹配的数据关键字,以及包含待查询数据的压缩数据块,解压所述压缩数据块,获得其中的待查询数据,具体包括:
将数据关键字的值对N取模,从与模值对应的子指针域中,获得第一个存储的相同模值的数据的关键字指针;
根据获得的关键字指针,查找相应模值对应的第一个数据的关键字,如果查找到的关键字和查询关键字匹配,则根据与数据关键字关联保存的数据所在压缩数据块的指针以及数据在所述数据块中的编号,查找出数据所在压缩数据块,解压所述数据块获得待查询数据,否则;
根据与数据关键字关联保存的相邻最近下一次模值相等的数据的数据关键字指针,继续查找。
可选的,所述方法还包括:
确认所述第一数据结构的头指针内包含数据压缩指示信息。
可选的,所述基于所述查询关键字,在第二数据结构的数据子指针域内,查找出与所述查询关键字对应的数据关键字包括:
用所述查询关键字对N取模,得到一个模值;
基于所述模值,在所述第二数据结构的数据指针域中查找出与所述查询关键字对应的数据关键字的地址;
将所述数据关键字与所述查询关键字进行匹配;
如果匹配成功,直接通过所述数据关键字获得数据信息;
如果匹配不成功,通过与所述数据关键字关联保存的相邻的最近下一个模值相等的数据的数据关键字的指针查找下一个数据关键字,直到匹配为止。
另一方面,本申请通过本申请中的实施例三提供如下技术方案:
一种数据存储装置,包括如下结构:
获取数据单元:用于获取待储存的数据块,所述数据块中包含至少一个数据;
压缩数据单元:用于将所述数据块压缩为压缩数据块;
第一数据存储单元:用于将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域,其中:所述第一数据结构包括第一有效数据域和第一数据指针域,所述第一有效数据域包括多个第一子数据域,每一个第一子数据域用于保存一个数据块中各个数据的数据关键字和压缩数据块,所述第一数据指针域用于保存检索数据时查找数据关键字的指针。
可选的,所述装置还包括如下结构:
第二数据存储单元:用于将每一个数据的数据关键字和数据块存入第二数据结构的第二有效数据域的一个第二子数据域,其中:所述第二数据结构包括第二有效数据域和第二数据指针域,所述第二有效数据域包括多个第二子数据域,每一个第二子数据域用于保存一个数据块中各个数据的数据关键字和数据,所述第二数据指针域用于保存检索数据时查找数据关键字的指针。
另一方面,本申请通过本申请中的实施例四提供如下技术方案:
一种查询使用实施例三的装置存储的数据的装置,其特征在于,包括:
查询关键字获取单元:用于确定待查询数据的查询关键字;
第一查找单元:用于基于在第一数据指针域保存的检索数据时查找数据关键字的指针,从第一有效数据域中的一个子数据域中,获取与所述查询关键字匹配的数据关键字,以及包含待查询数据的压缩数据块,解压所述压缩数据块,获得其中的待查询数据。
可选的,所述装置还包括:
计算单元:用于用所述查询关键字对N取模,得到一个模值;
第二查找单元:用于基于所述模值,在所述第二数据结构的数据指针域中查找出与所述查询关键字对应的数据关键字的地址;
判断单元:用于将所述数据关键字与所述查询关键字进行匹配;如果判断结果为是,直接通过所述数据关键字获得数据信息;以及
如果判断结果为否,通过与所述数据关键字关联保存的相邻的最近下一个模值相等的数据的数据关键字的指针查找下一个数据关键字,直到判断结果为是为止。
上述技术方案中的一个或多个技术方案,具有如下技术效果或优点:
(1)在内存中实现查表服务,并且对查询数据进行压缩,因此能降低服务的内存开销。
(2)在对查询数据进行压缩时,可以不压缩其关键字,因此其查询效率也能兼顾。
(3)固定大小的批数据压缩,且能在下一次压缩行为中补充不饱和的批数据重新压缩,在节约空间同时保证了压缩比。
具体实施方式
本申请实施例提供一种数据存储方法,采用特定的数据结构,将数据进行压缩后再进行存储,从而节省了存储空间,进而在进行数据查询时,减少了数据占用的内存。
为进一步数据的节省存储空间,本申请实施例还可以对数据的关键字以及相关查询信息进行压缩处理。
对于不需要进行压缩处理的数据,本申请实施例还提供存储不压缩数据的数据结构,配合存储进行了压缩处理的数据的数据结构,方便后期的数据查询。
如图2所示,为实现数据的压缩存储,以及后期对压缩数据的查询,本申请实施例采用的特定数据结构至少包括以下两部分:
有效数据域部分,用于存放压缩数据及其数据关键字;
数据指针域部分,用于存放查找数据关键字的指针。
其中:有效数据域可以包含多个子数据域,每一个子数据域用于保存一个数据块中各个数据的数据关键字和压缩数据块,数据指针域用于保存检索数据时查找数据关键字的指针。
有效数据域一般被划分为多个存储空间相等的子数据域,每一个子数据域用于存储同一批次的压缩数据。本申请实施例中,同一批次压缩处理的处理称为一个数据块,每一个数据块中包含一个或者多个数据。当需要存储的数据量比较大时,可以根据一个子数据域中存储的数据量,将数据分为多个批次进行压缩处理,属于同一个批次的数据组成一个数据块。
查询数据时,需要进行关键字匹配,所以需要将查询数据关键字的指针存入数据指针域中。如图3所示,具体为:
为提高查询效率,对数据进行虚拟分组,每一组中相邻数据的关键字指针关联保存,虚拟分组可以采用关键字值对总组数N取模的方式,并将数据指针域划分为N个子指针域,将每一个数据的数据关键字和压缩数据块存入数据结构的有效数据域的一个子数据域时,还分别针对每一个数据进行如下操作:将数据关键字的值对N取模,当该模值是第一次出现时,将数据关键字的指针作为查找相应模值对应的第一个数据的关键字指针保存到其中一个子指针域,否则,将数据关键字的指针和相邻最近上一次模值相等的数据的数据关键字,关联保存到相邻最近上一次模值相等的数据的数据关键字所保存的第一子数据域中。
在上述方式中,每一次查找时,先对关键字的值对N取模,找相应模值的第一个数据的关键字指针,后续再依次查找相同模值的关键字,从而减少了数据查询量,提高了查询效率。
如果需要进一步压缩数据量,则可以将每一个子数据域中,除压缩数据块的其他信息也进行压缩。这样在查询时,也需要相应的对这部分进行解压缩。
更进一步,如图4所示,本申请实施例中为不需要压缩的数据也提供了一种数据结构。这种数据结构中,同样主要包括有效数据域和数据指针域两部分,其中:有效数据域包含多个子数据域,每一个子数据域用于存储一个数据块及其中的各个数据的数据关键字,第二数据指针域用于保存检索数据时查找数据关键字的指针,数据指针域包含N个子指针域,每一个数据的数据关键字存入一个子数据域时,将数据关键字的值对N取模,当该模值是第一次出现时,将数据关键字的指针作为查找相应模值对应的第一个数据的关键字指针保存到其中一个子指针域,否则,将数据关键字的指针和相邻最近上一次模值相等的数据的数据关键字关联保存。
在两种数据结构中,还可包含一些基础信息,例如数据总量,剩余存储空间的指针,以及压缩数据指示信息等。该压缩数据指示信息用于标识是否为存储压缩数据的数据结构,当数据需要压缩保存时,根据压缩数据指示信息确定应该使用的数据结构。
上述两种数据结构中,如果当前存放数据的最后一个子数据域还有空余,也可以设置一个标识信息,在存储下一批次的数据时,先将有剩余存储空间的子数据域中的数据取出,并与新的数据合并组成设定大小的数据块后再存入,从而充分利用各个子数据域的存储空间。
本申请实施例中采用的数据结构可以是基于hash表的数据结构,也可以是其他类型的数据结构,下面先以基于hash表的数据结构为例进行说明。
如图5所示,基于hash表的数据结构主要包括以下四个部分:
第一部分,Hash_info:用于保存整个hash表的一些基础信息;
第二部分,Hash_bucket:hash表的桶空间,即数据指针域;
第三部分,data_items:用于存储真正的key-value,即有效数据域,主要存储数据块和数据关键字;
第四部分,reserved_space:预留空间,用于新增和修改数据用。
其中,Hash_info如图6所示,可以包含如下信息:
FileSize:数据大小,也即是指这个hash表占用的空间的大小;
HashSize:hash bucket大小,即Hash表桶空间的数量,也即是指数据指针域中的子指针域的数目;
IsCps:压缩标记,用于指示是否对数据进行压缩;
pFreeList:剩余空间的指针;
pHardData:当数据处于压缩时,最后一个数据块的指针;所述pHardData和pFreeList相结合,用于指示数据压缩是否饱和;
EleCnt:key-value对总数,也即是该hash表中的数据总数。
如图7所示,Hash_bucket对应HashSize个存储项,也就是图7中包含HashSize个OffSet,该OffSet均用于存放hash项的数据关键字指针,用以储存与该OffSet对应的在data_items中的数据关键字在同一个组的第一个数据关键字及与其关联的其他查询信息的指针。
当数据分别为非压缩和压缩状态时,其数据结构有所不同。
当hash_info中的IsCps设定对数据进行压缩时,data_items,也即是第一有效数据域的结构如图8所示,具体包括如下:
每一个data_items(也即是第一有效数据域)又包含多个data_block(也即是第一子数据域),而每一个data_block,又包含两个部分,分别为key(也就是数据的数据关键字和与数据关键字相关联的其他查询信息)和Cps_values(也即是压缩数据块)。其中,所有位于该hash表中的key的每一部分的第一个数据关键字的指针可以分别存放于该hash表的Hash_bucket中的不同的OffSet内,另外与每一个数据关键字相关联的查询信息包括:
OffSet:用于存储与该数据关键字位于同一组内的下一个数据的数据关键字的指针,也就是相邻最近下一次模值相等的数据的数据关键字的指针;
cps_values_offset:数据关键字对应的数据所在的数据块的指针;
cps_values_order:数据关键字对应的数据在数据块中的编号。
当hash_info中的IsCps设定对数据进行不压缩时,也即是在头指针域内不包含压缩数据指示信息。data_items的结构如图9所示,包括如下部分:
每一个data_items(也即是第二有效数据域)包含多个Data_item(也即是第二子数据域),也即是每一个第二有效数据域包含多个第二子数据域,每一个Data_item又包含三个互相关联的部分,分别为:
OffSet:存储数据关键字在同一组内的相邻下一个数据的数据关键字的指指针,即相邻最近下一次模值相等的数据的数据关键字的指针;
Hash_key:与数据对应的数据关键字;
Hash_value:待查询数据。
下面来通过具体实施例,来详细介绍本申请内容。
请参考图10-20,本申请实施例1,提供了一种数据储存方法,其基本流程如图10所示,包括如下步骤:
S1001:获取待储存的数据块,所述数据块中包含至少一个数据;
S1002:将所述数据块压缩为压缩数据块;
S1003:将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域,其中:所述第一数据结构包括第一有效数据域和第一数据指针域,所述第一有效数据域包括多个第一子数据域,每一个第一子数据域用于保存一个数据块中各个数据的数据关键字和压缩数据块,所述第一数据指针域用于保存检索数据时查找数据关键字的指针。
如果是用hash表来对数据进行储存,采集的数据为:1:a,2:b,3:c,其中采集的数据可以是一个也可以是多个,其中数字形式的1、2、3为数据关键字,字母a、b、c为数据信息。
本申请实施例1中,将这3个数据的数据关键字和其他查询信息相关联,而压缩数据则是对a、b、c组织到一起进行压缩。
如果是在前面所述的hash表中,此时所述hash表的data_items(也即是第一有效数据域)中,只包含一个data_block(相当于第一子数据域),每一个data_block,包含三个key_item(也即为数据关键字和与数据关键字相关联的其他查询信息)和一个cps_values(也即为数据块)。如果data_block中的数据只有一个,那么在key_item中只要有数据关键字和数据就可以,因为此时没有下一个数据需要查询。
在这批数据中的第一个数据是a,那么接着就应该把a的关键字信息存入所述第一数据结构的第一数据指针域的第一子指针域,如果是在所述hash表中,则是把在Hash_bucket中与a对应的OffSet中储存a的数据关键字的指针信息。
可选的,在第一数据指针域用于保存检索数据时查找数据关键字的指针时,具体包括:
第一数据指针域包括多个第一子指针域,每一个子指针域用于存储其中一个数据块中第一个数据的关键字指针;
每一个数据的数据关键字存入第一数据结构的第一有效数据域的一个第一子数据域时,还包括:在第一子数据域中,将每一个数据所在压缩数据块的指针以及数据在所述数据块中的编号和数据关键字关联保存,并将数据关键字的指针和同一数据块中相邻上一个数据的关键字关联保存。
可选的,数据关键字的指针可以按照如下的方式保存:第一数据指针域包含N个子指针域,所述将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域时,还包括:
分别针对每一个数据进行如下操作:
在第一子数据域中,将每一个数据所在压缩数据块的指针以及数据在所述数据块中的编号和数据关键字关联保存;
将数据关键字的值对N取模,当该模值是第一次出现时,将数据关键字的指针作为查找相应模值对应的第一个数据的关键字指针保存到其中一个子指针域,否则,将数据关键字的指针和相邻最近上一次模值相等的数据的数据关键字,关联保存到所述相邻最近上一次模值相等的数据的数据关键字所保存的第一子数据域中。
如果是在hash表中,选取Hash_bucket中的OffSet的个数为2个,也即是指选取的N值为2。也就是在所述hash表的Hash_bucket中存在2个OffSet(也即为在第一数据指针域中包含2个子指针域),也即为在所述hash表中将所有的数据关键字分为两个部分。这两个OffSet用来存放数据关键字位于同一组内的第一个数据的数据关键字的指针。每一个数据的数据关键字位于哪一个组内,由该数据的数据关键字模HashSize得到,例如第一数据a的关键字为1,那么1对2取模值为1,则说明数据a的关键字存于第一个hash桶。为简单起见选取reserved_space为0,那么容易得到即可得到在该hash表中,各个域的示意图,如图11所示。为后续介绍方便,将各个数据的指针标在各个数据的上方:其中hash_info中的信息可以如图12所示。
这里解释下为什么pFreeList的值是17:pFreeList表示空闲空间的偏移量,由于前面17的格子都装满,所以它取值为17。
可选的,在将数据进行压缩前,确认需要压缩所述待储存的数据块;以及确认所述第一数据结构的第一头指针域中包含压缩数据指示信息。
如果是在所述hash表中,则是确定所述数据a、b、c是否需要被压缩,如果a、b、c的长度较长,例如大于50个字节的话,就表示压缩可以节省空间,那么对a、b、c进行压缩。然后在hash表的头指针中将压缩标记,也就是IsCps设定为数据压缩状态,在本申请实施例中将IsCps的值设置为1,则表示数据处于压缩状态,具体如图13所示。
可选的,在Hash_info内可以添加Hash_bucket的指示信息,也即是指示在Hash_bucket中存在多个OffSet,这里用HashSize进行储存的,因为Hash_bucket中存在2个OffSet,所以HashSize的值为2,具体如图14所示。
Hash_bucket(也即是子指针域)的信息如图15所示,从图中所示信息可以看出该hash表中的data_item值中的第一个hash桶的第一个关键字信息地址为12,第二个hash桶的的第一个关键字信息地址为8。
而data_items中的数据则如图16所示。从图中可以看出,数据关键字和与其相关联的其他查询信息的起始位置为8,数据块的起始位置为20。
可选的,将每一个数据的数据关键字和数据块存入第一数据结构的第一有效数据域的一个第一子数据域之前,还可以进行如下步骤:
对第一子数据域中除压缩数据块以外的部分进行压缩处理。
如果是在所述hash表中,则是除了将数据块cps_values压缩外,还要将cps_values以外的部分进行压缩,这样可以进一步的节省内存空间。
可选的,获取待储存的数据块和将所述数据块压缩为压缩数据块之间,还包括:
基于所述头指针域内的是否有剩余空间第一子数据域的指示信息,判断所述第一数据结构的第一有效数据域中存在数据压缩未饱和的第一子数据域时,则根据所述第一数据结构的头指针域内的未饱和压缩数据块在已经存有数据的最后一个第一子数据域中的位置指示信息,取出已经存入最后一个第一子数据域的压缩数据块并解压缩,将解压缩的数据合并入待存储的数据块。
如果是在该hash表中,那么可以根据pFreeList(也即是剩余空间指针)和pHardData(也即是最有一个数据块的指针)的数据来判断上一批的数据压缩是否饱和,其具体判断方法为,如果pHardData-pFreeList小于一个固定的大小,这个数据一般为:一个数据块的key_item数(假如为200个)*key_item的大小(假如为20个字节),就说明存在不饱和情况。当判断出上一步的数据没有压缩饱和时,则可取出上一批压缩的不饱和的数据,加入新采集的数据,然后再进行压缩处理。从图中pHardData、pFreeList的数据可以看出,pHardData-pFreeList的值为0,也就是必然小于一个数据块的key_item数*key_item的大小,于是说明现在的数据压缩并未饱和。
可选的,将每一个数据的数据关键字和数据块存入第二数据结构的第二有效数据域的一个第二子数据域,其中:所述第二数据结构包括第二有效数据域和第二数据指针域,所述第二有效数据域包括多个第二子数据域,每一个第二子数据域用于保存一个数据块中各个数据的数据关键字和数据,所述第二数据指针域用于保存检索数据时查找数据关键字的指针。
如果是在hash表中,那么则是在hash表的头指针中的IsCps压缩标记设置为不压缩状态,在本实施例中设置为0,然后在hash表的data_items(也即是第二有效数据域)中将每个数据关键字和与之对应的数据相关联,组成data_item(也即是第二子数据域),在hash表的Hash_bucket(也即是第二数据指针域)中将其OffSet(也即是第二子指针域)设置为data_items中的第一个data_item的地址。
可选的,所述第二数据指针域包含N个子指针域,所述将每一个数据的数据关键字存入第二数据结构的第二有效数据域的一个第二子数据域时,还包括:
将数据关键字的值对N取模,当该模值是第一次出现时,将数据关键字的指针作为查找相应模值对应的第一个数据的关键字指针保存到其中一个子指针域,否则,将数据关键字的指针和相邻最近上一次模值相等的数据的数据关键字关联保存。
如果在该hash表中,选择的Hash_bucket中的OffSet为2个(也即为N值为2),那么其结构示意图可以如17所示。
Hash_info中的信息如果18所示。从图中可以看出HashSize的值为2,因为前面已经设定N的值为2。
Hash_bucket中的信息如图19所示,从图中可以看出来,在该hash表中,Hash_bucket中的OffSet中的第一个指针为11,第二个指针为8。因为数据结构有差异,所以在非压缩状态下数据储存位置已经发生变化。
Data_items中的信息如图20所示。
通过本实施例,因为对数据进行压缩处理,其中可以仅对数据进行压缩,也可以将所有数据一起压缩,故而能够达到降低服务器储存空间的目的。
另一方面,请参考图21,本申请的实施例2提供了一种数据查询方法,包括如下步骤:
S2101:确定待查询数据的查询关键字;
S2102:基于在第一数据指针域保存的检索数据时查找数据关键字的指针,从第一有效数据域中的一个子数据域中,获取与所述查询关键字匹配的数据关键字,以及包含待查询数据的压缩数据块,解压所述压缩数据块,获得其中的待查询数据。
在这里进行查询时,既可以通过查询关键字直接在外部数据库进行查询,也可以在外部数据库查找到相关数据后,将其载入内存再进行查询,这里载入内存的数据可能是压缩的、也可能是非压缩的、还可能是压缩和非压缩数据都有的。如果是在前面所述的hash表中,假设查询关键字为3,那么先应该根据查询关键字在Hash_bucket(也即是数据指针域)中的OffSet(也即子指针域)中,查找出关键字3所对应的数据在data_items(也即是第一有效数据域)中的指针,然后通过该指针,获得与查询关键字3对应的数据关键字,通过与查询关键字3对应的数据关键字,获得与之对应的数据块,然后解压数据块,即可获得查询数据。
可选的,从第一有效数据域中的一个子数据域中,获取与所述查询关键字匹配的数据关键字,以及包含待查询数据的压缩数据块,解压所述压缩数据块,获得其中的待查询数据,具体包括:
将数据关键字的值对N取模,从与模值对应的子指针域中,获得第一个存储的相同模值的数据的关键字指针;
根据获得的关键字指针,查找相应模值对应的第一个数据的关键字,如果查找到的关键字和查询关键字匹配,则根据与数据关键字关联保存的数据所在压缩数据块的指针以及数据在所述数据块中的编号,查找出数据所在压缩数据块,解压所述数据块获得待查询数据,否则;
根据与数据关键字关联保存的相邻最近下一次模值相等的数据的数据关键字指针,继续查找。
如果是在hash表中,从图14可知,HashSize的值为2,而查询关键字3对HashSize2取模得到的值为1。所以可以得出查询关键字3所对应的数据中的第一个数据的数据关键字指针存放于Hash_bucket中的1号OffSet中。从图15可知Hash_bucket中的1号OffSet中的数据为8,则表示1号OffSet所对应的数据的第一个数据的数据关键字及其关联的其他查询信息在8号位置,即可据此查找出数据关键字,查找出数据关键字后,将数据关键字和查询关键字进行匹配,如果匹配成功,则直接通过cps_values_offset和cps_value_order取出数据,如果不匹配,通过与数据关联的OffSet(也即是同一个组内的下一个数据关键字和其关联的其他查询信息的指针)查找下一个数据,如图16所示,8号位置对应的数据关键字是1,而查询关键字是3,则说明数据关键字与查询关键字不匹配,那么查找下一个数据,与第一个数据关键字相关联的OffSet值为16,那么说明下一个数据关键字和与其相关联的其他查询信息在16号位置,在16号位置取出其中的数据关键字为3,与查询关键字匹配,那么取出对应的压缩数据块,因为16号位置对应的关键字信息中的cps_value_offset值为20,说明压缩数据块从第20位算起,而cps_values_order值为2,则取出20号起第2位数据(其中编号从0算起),即可取出与数据关键字3相对应的数据:c。
可选的,如果在查询数据库中的数据既有压缩的,也有没有压缩的,那么应该先确认所述第一数据结构的第一头指针域中包含压缩数据指示信息。
如果是在hash表中,那么就是判断所述hash表的hash_info(也即是头指针)中的IsCps(也即是压缩标记)的值是否为1,因为前面压缩时,是以1为压缩标记的。
可选的,如果该数据结构中,不包含压缩信息,则按如下方法进行查找:
用所述查询关键字对N取模,得到一个模值;
基于所述模值,在所述第二数据结构的数据指针域中查找出与所述查询关键字对应的数据关键字的地址;
将所述数据关键字与所述查询关键字进行匹配;
如果匹配成功,直接通过所述数据关键字获得数据信息;
如果匹配不成功,通过与所述数据关键字关联保存的相邻的最近下一个模值相等的数据的数据关键字的指针查找下一个数据关键字,直到匹配为止。
如果在hash表中,还是以查询关键字3为例。先用查询关键字3对Hash_Size(也即为子指针域的个数)取模,计算出查询关键字3所对应的Hash_bucket中的OffSet的位置。因为查询关键字3对HashSize取模值为1,那么即为查询关键字3对应的数据块的第一个数据的数据关键字和与其关联的其他查询信息存放于Hash_bucket中的1号(因为从0开始算起)OffSet中。然后先从Hash_bucket中的1号OffSet中,取出与查询关键字3对应的数据的第一个数据的数据关键字和与其关联的其他查询信息,从图19可以看出,这里OffSet的值为11,查找至11号位置,得出数据关键字为1,和查询关键字3不匹配,继续通过与数据关键字1相关联的的OffSet查找下一位数据,从图20上可以看出OffSet的值为14,也就是下一位数据的地址为14,查找得出数据关键字为3,和查询关键字3匹配,直接取出数据为:c。
上述查找过程,要先将待查找数据载入内存进行查找。因为查找的数据有进行压缩,所以能够降低内存开销,另外如果关键字没有压缩,也能兼顾到查询的效率。
另一方面,请参考图22,本申请的实施例3提供了一种数据存储装置,包括如下部分:
获取数据单元2201:用于获取待储存的数据块,所述数据块中包含至少一个数据;
压缩数据单元2202:用于将所述数据块压缩为压缩数据块;
第一数据存储单元2203:用于将每一个数据的数据关键字和压缩数据块存入第一数据结构的第一有效数据域的一个第一子数据域,其中:所述第一数据结构包括第一有效数据域和第一数据指针域,所述第一有效数据域包括多个第一子数据域,每一个第一子数据域用于保存一个数据块中各个数据的数据关键字和压缩数据块,所述第一数据指针域用于保存检索数据时查找数据关键字的指针。
可选的,在具体实施过程中,该数据存储装置还可以包括第二存储单元:用于将每一个数据的数据关键字和数据块存入第二数据结构的第二有效数据域的一个第二子数据域,其中:所述第二数据结构包括第二有效数据域和第二数据指针域,所述第二有效数据域包括多个第二子数据域,每一个第二子数据域用于保存一个数据块中各个数据的数据关键字和数据,所述第二数据指针域用于保存检索数据时查找数据关键字的指针。
另一方面,请参考图23,本申请的实施例4提供了一种数据查询装置。包括如下部分:
查询关键字获取单元2301:用于确定待查询数据的查询关键字;
第一查找单元2302:用于基于在第一数据指针域保存的检索数据时查找数据关键字的指针,从第一有效数据域中的一个子数据域中,获取与所述查询关键字匹配的数据关键字,以及包含待查询数据的压缩数据块,解压所述压缩数据块,获得其中的待查询数据。
可选的,在具体实施过程中,该数据查询装置还可以包括:
计算单元:用于用所述查询关键字对N取模,得到一个模值;
第二查找单元:用于基于所述模值,在所述第二数据结构的数据指针域中查找出与所述查询关键字对应的数据关键字的地址;
判断单元:用于将所述数据关键字与所述查询关键字进行匹配;如果判断结果为是,直接通过所述数据关键字获得数据信息;以及
如果判断结果为否,通过与所述数据关键字关联保存的相邻的最近下一个模值相等的数据的数据关键字的指针查找下一个数据关键字,直到判断结果为是为止。
通过本申请的实施例中的一个或多个实施例,可以实现如下至少一个技术效果:
(1)在内存中实现查表服务,并且对查询数据进行压缩,所以能降低服务的内存开销。
(2)在对查询数据进行压缩时,可以不压缩其关键字,所以其查询效率也能兼顾。
(3)固定大小的批数据压缩,且能在下一次压缩行为中补充不饱和的批数据重新压缩,以节约空间同时保证压缩比。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。