具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
传统的long型、double型或float型等类型数据的压缩方案中,会直接使用变长编码的方式进行压缩,此方法对于long型、double型或float型等类型数据序列的值分布不均匀的情况,反而会带来负优化(long型、double型或float型等类型数据的值比较大的时候,压缩的字节数>8B);并且,传统压缩方案对于数据随机打乱的序列的压缩效果不佳。鉴于此,需要提出一种更有效地针对long型、double型或float型等类型的数据的、不受数据的值分布和/或随机性影响的数据压缩方法。
例如,在一个具体的应用场景中,图引擎Sharkgraph能够提供超大容量的图存储和图计算,并且支持时序图,Sharkgraph中的点边属性可以按照列式存储,其中,点边属性中包含大量诸如long/double类型的数据。这样的一个图数据库占用的存储空间通常非常大,因此,有必要提出一种有效的数据压缩方案,来应对超大图的计算,以更好地利用存储空间。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为本说明书实施例提供的一种数据压缩方法的流程示意图。从程序角度而言,流程的执行主体可以为搭载于应用服务器的程序或应用客户端。
参照图1,该数据压缩方法可以包括以下步骤:
S110:根据原始序列,生成第一数组,所述第一数组中的元素互不相同,且包含所述原始序列中的全部数值。
其中,原始序列可以是任意数据类型的序列,优选地,可以是long型、double型或float型等32位或64位的较多位数的数据的序列。也就是说,本公开的实施例提供的数据压缩方法可以适用于任一数据类型的数据序列,其中,对于long型、double型或float型等类型的数据序列的压缩效果尤其突出。
根据实施例,可以根据原始序列,通过序列去重的方法来生成第一数组,以使得第一数组中包含原始序列中的所有互不相同的元素。可以采用任何现有的去重方法来生成第一数组,根据不同的方法得到的第一数组中的元素可以与原始序列中的元素具有相一致的顺序,或者可以具有随机的顺序。具体地,例如,若原始序列中包含[100,400,200,400,500,100,500],第一数组中的元素顺序可以与原始序列一致,即,可以为[100,400,200,500];或者第一数组中的元素顺序可以是随机的,例如,可以为[400,200,100,500]等。
例如,可以通过distinct语句来获取第一数组,得到的第一数组中可以包含原始序列中互不相同的元素,其中,第一数组中元素的顺序可以与相应元素在原始序列中首次出现的顺序一致。第一数组中的元素的数据类型可以与原始序列中的元素的数据类型相同。
S120:根据所述原始序列,生成第二数组,所述第二数组中的元素是所述原始序列中的元素在所述第一数组中的位置索引。
其中,第二数组中的元素是索引值,具体地,是原始序列中的元素在第一数组中的位置索引。由于原始序列中的元素的量是有限的,所以作为位置索引的集合的第二数组中的元素的数值范围有限,并且第二数组中的元素的数值通常相对较小,非常适用于使用变长编码方法来实现有效的压缩。第二数组中的元素的数据类型可以与原始序列中的元素的数据类型不同,例如,当原始序列中的数据类型为Long型时,第二数组中的元素可以是32int型数据。
根据实施例,根据不同的数组生成方法,根据原始序列生成第一数组和根据原始序列生成第二数组两个步骤可以依次进行,也可以同时进行,本申请对此不做限定。
S130:采用基于数值预测的编码方法对所述第一数组进行编码,得到第一编码结果。
具体地,数值预测方法可以包括诸如Last值预测器(Last Value Predictor)、步长预测器(Stride Predictor)、有限上下文预测方法(Finite Context Method,FCM)、差分有限上下文预测方法(Differential Finite Context Method,DFCM)等的数值预测方法,但是不限于在此所列举的。
具体地,基于数值预测方法的编码方法,指的是,通过对待编码元素进行预测,得到预测值与待编码元素之间的差异,将该差异进行编码存储,即实现对元素的编码。
根据实施例,得到第一编码结果后,可以将第一编码结果以字节数组的形式进行存储。
S140:采用变长编码方法对所述第二数组进行编码,得到第二编码结果。
根据实施例,变长编码方法,即,变长字节编码方法,是对同一类型的数据使用不同长度的字节数据来表示的编码方法,可以有利于减少数据的字节总数,从而减少占用的存储空间。变长编码的方法包括诸如UTF-8、Base 128Varints等的基于高位区分的变长编码方法和利用代理去做区分的变长编码方法。
根据实施例,得到第二编码结果后,可以将第二编码结果以字节数组的形式进行存储。根据实施例,当第二数组中的元素是32int型数据时,编码前,每个数据占用4个字节;编码后,每个数据可以占用1至4个字节。
S150:按照预设映射关系,存储所述第一编码结果和所述第二编码结果。
具体地,所述第一编码结构和所述第二编码结果共同构成了原始序列的压缩数据。其中,所述映射关系包括,所述第二编码结果中的元素表示的是原始序列中的元素在第一编码结果中的位置索引。
根据实施例,在包含第一编码结果和第二编码结果的编码结果中,可以包括压缩头,所述压缩头中可以存储所述预设映射关系。可选地,所述压缩头中还可以存储第一编码结果和第二编码结果的存储结构相关信息。
当第一数组和第二数组均被编码完成后,可以按照字节来存储相应的第一编码结果和第二编码结果,即,将第一编码结果和第二编码结果存储为字节数组。在此,存储介质不被具体限定。
图2为本说明书实施例提供的一种数据压缩方法的原理示意图。
结合图1和图2可知,本公开的上述实施例提供了一种数据压缩方法,创造性地通过将原始序列转化为两个数组来对序列进行压缩,并根据转化后的不同数组的特征来进行指定的压缩。本公开实施例的压缩方法的压缩效果与值分布无关,可以实现对于任意数值范围的数值序列的压缩,即使是对于数值大小分布不均的序列,压缩效果也非常好,得到较大的数据压缩率;当序列中值分布密集时,或者有很多相同的值时,压缩效果极为突出,具有更大的压缩率。通过本公开的实施例提供的数据压缩方法可以减小需要传输或存储的文件的字节总数,从而实现数据的更快传输、减少文件的磁盘占用空间、提高存储空间的利用率。
下面将结合附图对本公开实施例的具体实施步骤进行详细介绍。
根据实施例,所述根据所述原始序列,生成第二数组(步骤S120),具体可以包括:读取原始序列中的元素;在第一数组中查找与所述元素的值相同的元素;获取所述第一数组中的所述元素在所述第一数组中的下标值,存储至第二数组。生成第二数组的方法不限于在此描述的该方法。
根据实施例,所述采用基于数值预测的编码方法对所述第一数组进行编码,得到第一编码结果(步骤S130),具体可以包括:采用预测器对所述第一数组中的元素进行预测,得到预测值;对所述预测值与被预测元素的真实值执行异或运算,得到异或结果;对所述异或结果进行编码,得到第一编码结果。
根据实施例,如果元素的预测值与元素的值接近,那么元素的所述预测值与元素的所述值的若干个高位相同,则它们的异或结果可以具有若干个前导零,从而,可以将异或结果的若干个前导零进行压缩。显然,预测值与元素的真值越接近,则异或结果中的前导零越多,则可以将异或结果进行越大程度的压缩。
图3为本说明书实施例提供的基于数值预测的编码方法的示意图。
根据可选的实施例,在步骤S130中,所述对所述异或结果进行编码,得到第一编码结果,具体可以包括:对所述异或结果的前导零进行编码,得到第一编码段;将所述异或结果中除所述前导零之外的部分确定为第二编码段;根据所述第一编码段和所述第二编码段得到第一编码结果。
可选地,第一编码结果中可以依次包括各元素的第一编码段和第二编码段,具体地,第一编码结果中可以由起始位置至结束位置顺序地包括第一元素的第一编码段、第一元素的第二编码段、第二元素的第一编码段、第二元素的第二编码段、……、第n元素的第一编码段、第n元素的第二编码段。
可选地,第一编码结果中可以以每两个元素为一组来包括第一编码段和第二编码段,具体地,第一编码结果中可以由起始位置至结束位置顺序地包括第一元素的第一编码段、第二元素的第一编码段、第一元素的第二编码段、第二元素的第二编码段、……、第n-1元素的第一编码段、第n元素的第一编码段、第n-1元素的第二编码段、第n元素的第二编码段。其中,第一元素的第一编码段和第二元素的第一编码段可以保存在一个字节中。需要说明的是,第一编码结果中,各元素的第一编码段和第二编码段的存储方式不限于上述两种方法,而是可以以任何合理的顺序存储。
具体地,参照图3,数据Dn的编码压缩方法可以包括:预测器生成预测值Predn;将待压缩值Dn与预测值Predn做异或运算,得到异或结果Diffn,其中,若预测值Predn与待压缩值Dn接近,则异或结果Diffn包含若干前导零;通过前导零计数值来编码所述异或结果Diffn中的所述若干前导零;得到编码结果LZCnBitsn。其中,用第一编码段LZCn表示前导零计数值;用第二编码段Bitsn表示剩余位。根据实施例,可以使用预设数量的bit(例如,4个bit)来表示第一编码段LZCn。
相应地,当进行数据解压缩时,将压缩数据LZCnBitsn解压缩至Dn的方法可以包括:读取预设数量的bit(例如,4个bit)的第一编码段LZCn和相应的剩余bit(例如,64减去LZCn中读取出的前导零所占的bit数)的第二编码段Bitsn,获得Diffn;使用与数据压缩时相同的预测值Predn与Diffn做异或运算,得到解压缩数据Dn。
当异或结果中不仅包括前导零,还包括尾部零时,可以同时对前导零和尾部零进行编码压缩。
根据另一可选的实施例,在步骤S130中,所述对所述异或结果进行编码,得到第一编码结果,具体还可以包括:对所述异或结果的前导零进行编码,得到第一编码段;对所述异或结果的尾部零进行编码,得到第二编码段;将所述异或结果中除所述前导零和所述尾部零之外的部分,确定为第三编码段;根据所述第一编码段、所述第二编码段和所述第三编码段得到第一编码结果,其中,所述第一编码结果中依次包括所述第一编码段、所述第三编码段和所述第二编码段。
可选地,第一编码结果中可以依次包括各元素的第一编码段、第二编码段和第三编码段,具体地,第一编码结果中可以由起始位置至结束位置顺序地包括第一元素的第一编码段、第一元素的第二编码段、第一元素的第三编码段、第二元素的第一编码段、第二元素的第二编码段、第二元素的第三编码段、……、第n元素的第一编码段、第n元素的第二编码段、第n元素的第三编码段。
可选地,第一编码结果中可以以每两个元素为一组来包括第一编码段、第二编码段和第三编码段,具体地,第一编码结果中可以由起始位置至结束位置顺序地包括第一元素的第一编码段、第二元素的第一编码段、第一元素的第二编码段、第二元素的第二编码段、第一元素的第三编码段、第二元素的第三编码段、……、第n-1元素的第一编码段、第n元素的第一编码段、第n-1元素的第二编码段、第n元素的第二编码段、第n-1元素的第三编码段、第n元素的第三编码段。其中,第一元素的第一编码段和第二元素的第一编码段可以保存在一个字节中,第一元素的第三编码段和第二元素的第三编码段可以保存在一个字节中。需要说明的是,第一编码结果中,各元素的第一编码段、第二编码段、第三编码段的存储方式不限于上述两种方法,而是可以以任何合理的顺序存储。
具体地,对数据Dn的编码压缩方法可以包括:预测器生成预测值Predn;将待压缩值Dn与预测值Predn做异或运算,得到异或结果Diffn,其中,异或结果Diffn包含n1个前导零和n2个尾部零;通过前导零计数值来编码所述n1个前导零,并通过尾部零计数值来编码所述n2个尾部零;得到编码结果LZCnBitsnTZCn。其中,编码结果中,用第一编码段LZCn表示前导零计数值,用第二编码段TZCn表示尾部零计数值;用第三编码段Bitsn表示剩余位。根据实施例,可以使用第一预设数量的bit(例如,4个bit)来表示第一编码段LZCn,可以使用第二预设数量的bit(例如,4个bit)来表示第二编码段TZCn。
根据实施例,在实际应用中,可以根据实际需要来进行前导零和/或尾部零的压缩,以实现数据被最大程度地压缩,从而得到最大的压缩率。
图4为本说明书实施例提供的基于数值预测的编码方法中的一种数值预测方法的示意图。
根据可选的实施例,在步骤S130中,所述对所述第一数组中的元素进行预测,得到预测值,具体可以包括:基于待预测元素的前若干元素构成的序列,查找相应的历史值序列;基于所述历史值序列,得到相应的预测值。
具体地,可以根据待预测元素的前若干(例如,前3个)元素所构成的序列,在历史值表中查找与该序列一致的历史值序列,并将查找到的历史值序列作为索引,在预测值表中查找相应的预测值。如果未查找到与当前序列一致的历史值序列,则为当前待预测元素赋予一个初始的预测值。
更具体地,参照图4,所述基于数值预测的编码方法具体可以为基于上下文的数值预测方法,其中,上下文可以是若干相邻的元素构成的历史值。历史值表中包含已处理的数据序列,例如,所述数据序列中可以包括待压缩数组中已处理过的连续的元素所构成的数据序列。其中,数据序列中的数据的数量可以根据需要来设定,这一数值设置得越大,预测结果越准确,但是预测耗时越多,例如,该数量可以设置为3个。其中,预测值表中包含的是在历史值表中的数据序列之后出现过的数值。当进行预测时,首先在历史值表中查找与当前元素的相邻元素对应的历史值序列;然后以该历史值序列为索引,通过哈希方程在预测值表中查找预测值。
根据实施例,当被预测元素的值已知后,可以更新预测器中的数值。具体地,可以将元素的真实值更新至预测值表中,并且可以根据元素的真实值和旧的历史值,来更新历史值表。
图5为本说明书实施例提供的基于数值预测的编码方法中的另一种数值预测方法的示意图。
根据另一可选的实施例,所述对所述第一数组中的元素进行预测,得到预测值,具体可以包括:基于待预测元素的前若干元素的差值序列,查找相应的历史差值序列;基于所述历史差值序列,得到相应的预测差值;基于所述待预测元素的前一元素和所述预测差值,得到所述待预测元素的预测值。
具体地,可以根据待预测元素的前若干个元素,得到所述前若干个元素中每相邻两个元素间的差值构成的差值序列;在历史差值表中查找与所述差值序列一致的历史差值序列;并将查找到的历史差值序列作为索引,在预测差值表中查找相应的预测差值。如果未查找到与当前差值序列一致的历史差值序列,则为当前待预测差值赋予一个初始的预测差值。
更具体地,参照图5,历史值表可以存储待预测数值Dn的前一数值Dn-1以及历史差值序列,所述历史差值序列是已处理过的数据的相邻元素之间的差值所构成的序列。其中,所述历史差值序列可以是,例如,连续四个数据彼此之间的三个差值所构成的序列。预测差值表中可以包含历史差值表中的历史差值序列之后出现过的差值。当进行预测时,例如,可以首先基于当前数值Dn的前四个元素之间的差值构成的差值序列,在历史值表中查找与该差值序列一致的历史差值序列,例如,(delta1,delta2,delta3);然后以该历史差值序列为索引,通过哈希方程在预测差值表中寻找预测差值,例如,dpre;再将前一数值Dn-1与所述预测差值dpre相加,得到预测值Predn=Dn-1+dpre。
根据实施例,当得知被预测元素的真实值之后,可以对预测器中的数值进行更新。具体地,可以将被预测元素的真实值更新至历史值表中;可以计算当被预测元素的真实值与前一元素的值之间的差值,作为新的差值,然后,将所述新的差值存储至预测差值表中,并根据所述新的差值和旧的历史差值来更新历史差值表。
图4和图5分别描述了通过不同的预测器来进行数值预测的过程,在应用中,可以根据实际需要来采用图4或图5的中描述的任一种预测器来获取预测值。根据本公开的实施例,为了提高预测的准确性,提高预测速率,并且提高压缩率等,可以同时采用不止一个预测器。
图6为本说明书实施例提供的采用两个预测器的基于数值预测的编码方法的示意图。
具体地,参照图6,步骤S130的所述采用基于数值预测的编码方法对所述第一数组进行编码,得到第一编码结果,具体可以包括:采用第一预测器对所述第一数组中的元素进行预测,得到第一预测值;采用第二预测器对所述第一数组中的元素进行预测,得到第二预测值;对所述第一预测值与被预测元素的真实值执行异或运算,得到第一异或结果;对所述第二预测值与被预测元素的真实值执行异或运算,得到第二异或结果;对比所述第一异或结果的前导零数量和所述第二异或结果的前导零数量,将前导零数量多的结果作为最终异或结果;对所述最终异或结果进行编码,得到第一编码结果。
根据实施例,对第一异或结果的对比和第二异或结果的对比,包括对异或结果中的前导零的数量和/或尾部零的数量进行对比。例如,可以比较前导零的数量,并将前导零的数量多的异或结果,作为优选的最终异或结果。又例如,可以比较尾部零的数量,并将尾部零数量多的异或结果,作为优选的最终异或结果。再例如,可以比较前导零和尾部零的总数量,将前导零和尾部零的数量之和较大的异或结果,优选为最终异或结果。选择优选异或结果的方式不限于此。
可选地,第一预测器和第二预测器可以相同或不同,例如,可以分别独立地选择如图4或图5中所示的预测器,也可以选择除图4和图5中示出的预测器之外的预测器。
对于步骤S140,下面以Base 128Varints这一变长编码方法为例来说明,对第二数组进行编码的具体过程。
Base 128Varints编码方法可以使用一个或多个字节来表示整型数据。在Base128Varints的编码串中,每个字节中得最高位(msb)作为标志位,若该位为1,表示下一字节与当前字节共同表示当前数值,若该位为0,表示当前字节为当前数值的最后一个字节;字节中的其余七位将用于存储数据本身,由于仅使用7位进行编码,最多表示小于2的7次方的数值,即,0~127。对于小于2的7次方的数值,可以使用2个字节表示;对于小于2的14次方的数值,可以使用2个字节表示;对于小于2的21次方的数值,可以使用3个字节表示;对于小于2的28次方的数值,可以使用4个字节表示。
下面以int32型数组[1,300,1024]为例来说明。
对于十进制数字1,二进制(4个字节)表示为00000000 00000000 0000000000000001。变长编码后仅占用一个字节即可表示,如:00000001。数字1可以使用1个字节来表示。
对于十进制数字300,二进制(4个字节)表示为00000000 00000000 0000000100101100。编码过程如下:(1)从二进制低字节开始,每7位进行分割,得到00000100101100;(2)倒序,得到0101100 0000010;(3)增加标识符,得到编码串1010110000000010。即,数字300可以使用2个字节来表示。相应地,当对编码串10101100 00000010解码时:(1)第1个字节的最高位是1,继续向后读取,第2个字节的最高位是0,表明当前数值由2字节表示;(2)取两个字节的低7位0101100 0000010;(3)倒序,0000010 0101100,即十进制的300。
对于十进制数字1024,二进制(4个字节)表示为00000000 00000000 0000010000000000。编码过程如下:(1)从二进制低字节开始,每7位进行分割,得到00010000000000;(2)倒序,得到0000000 0001000;(3)增加标识符,得到编码串1000000000001000。数字1024可以使用2个字节来表示。
对于int32型定长编码的初始数组[1,300,1024],编码前占用字节数为12,经过变长编码后占用的字节数为5。变长编码显著减小了数组存储占用的内存空间。
可以看出,变长编码压缩对于越小的数值的压缩效果越明显。对于本公开的实施例,第二数组中存储的是位置索引值,在待压缩数组中元素的数量有限的情况下,位置索引值的数值范围有限且一般为比较小的数值,因此,可以充分利用变长编码进行压缩的优势,能非常有效地减少字节数,取得显著的压缩效果。
根据上述描述,本公开提供了一种数据压缩方法,该数据压缩方法首先将原始序列转化为两个数组,并根据两个数组的数据特征,针对性地分别选用不同的压缩方法来进行压缩,从而实现对原始序列的最大程度压缩,得到最大的压缩率。在这一过程中,使用了基于数值预测的压缩方法,这一压缩方法可以适用于任意顺序排列的数据,不过,对于数据排列越混乱的数组,进行数值预测的过程的时间复杂度和操作复杂度越高。鉴于此,本公开的提供了一种如下可选的数据压缩方法,其中,先将待编码的数组进行排序,然后再采用基于数值预测的方法来编码。采用使用排序的基于数值预测的压缩方法,不仅可以降低数值预测过程的时间复杂度和操作复杂度,也可以进一步提高压缩率。
图7为本说明书实施例提供的根据原始序列生成第一数组的方法的示意图。
在本公开的另一实施例中,参照图7,根据原始序列,生成第一数组的步骤,具体可以包括:S111,提取原始序列中的值不同的元素,生成第一预备数组;S112,将所述第一预备数组中的元素按照预定排序规则排序,生成第一数组。
具体地,根据实施例,所述预定排序规则可以是按照值从大到小的顺序、值从小到大的顺序、尾部数值从大到小的顺序、尾部数值从小到大的顺序等各种按需设定的排序规则。例如,可以使用sort函数来实现第一数组的排序,从而实现按照值从大到小或从小到大的顺序排序,这样的排序结果使得相邻的数值的高位相似度较高,当进行异或运算时可以产生更多的前导零。实现排序的方式不限于此,而是可以使用现有技术中任何适用的方法来进行第一数组的排序。
根据实施例,对第一数组进行排序可以使得第一数组中相邻的数值的关联性更大,挖掘出相邻值的更多相似性,当进行异或运算时,异或结果中的前导零和/或尾部零数量更多,使得第一数组可以被更大程度地压缩,第一压缩结果占用的字节数更少,从而减小压缩数据占用的存储空间和/或使用的传输时间。
根据本公开的实施例,提供了上述数据压缩方法,该数据压缩方法不仅对于任意值分布的数据序列压缩效果明显;并且,可以对任意顺序分布的序列的有好的压缩效果,即,对于无序/乱序分布的数据序列也可以取得很好的压缩率。
为了更清楚地描述本发明的实施例,下面具体示出了根据实施例的一个数据压缩示例:
原始序列:
[24,22,11,20,11,6,25,33,7,41,26,46,34,47,49,26,26,10,2,39,35,8,43,3,28,29,22,1,5,38,36,42,44,29,24,30,0,15,34,6,14,31,38,34,44,15,17,5,19,41,23,30,37,25,44,27,33,23,11,27,32,3,43,29,18,45,13,4,5,20,11,0,18,3,32,32,31,17,0,30,7,26,47,30,20,46,35,10,19,18,43,11,29,5,6,39,33,31,14,23]
第一数组(排序后):
[0,1,2,3,4,5,6,7,8,10,11,13,14,15,17,18,19,20,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49]
第一编码结果:
[118B,1B,-1B,-1B,-1B,-10B,2B,110B,1B,1B,-17B,1B,-18B,1B,1B,-1B,102B,2B,1B,-1B,-1B,-1B,-1B,-1B,-1B,-1B,-1B,-18B,1B,1B,-1B,-1B,-2B,1B,0B]
第二数组:
[20,18,10,17,10,6,21,29,7,36,22,41,30,42,43,22,22,9,2,35,31,8,38,3,24,25,18,1,5,34,32,37,39,25,20,26,0,13,30,6,12,27,34,30,39,13,14,5,16,36,19,26,33,21,39,23,29,19,10,23,28,3,38,25,15,40,11,4,5,17,10,0,15,3,28,28,27,14,0,26,7,22,42,26,17,41,31,9,16,15,38,10,25,5,6,35,29,27,12,19]
第二编码结果:
[8B,20B,8B,18B,8B,10B,8B,17B,8B,10B,8B,6B,8B,21B,8B,29B,8B,7B,8B,36B,8B,22B,8B,41B,8B,30B,8B,42B,8B,43B,8B,22B,8B,22B,8B,9B,8B,2B,8B,35B,8B,31B,8B,8B,8B,38B,8B,3B,8B,24B,8B,25B,8B,18B,8B,1B,8B,5B,8B,34B,8B,32B,8B,37B,8B,39B,8B,25B,8B,20B,8B,26B,8B,0B,8B,13B,8B,30B,8B,6B,8B,12B,8B,27B,8B,34B,8B,30B,8B,39B,8B,13B,8B,14B,8B,5B,8B,16B,8B,36B,8B,19B,8B,26B,8B,33B,8B,21B,8B,39B,8B,23B,8B,29B,8B,19B,8B,10B,8B,23B,8B,28B,8B,3B,8B,38B,8B,25B,8B,15B,8B,40B,8B,11B,8B,4B,8B,5B,8B,17B,8B,10B,8B,0B,8B,15B,8B,3B,8B,28B,8B,28B,8B,27B,8B,14B,8B,0B,8B,26B,8B,7B,8B,22B,8B,42B,8B,26B,8B,17B,8B,41B,8B,31B,8B,9B,8B,16B,8B,15B,8B,38B,8B,10B,8B,25B,8B,5B,8B,6B,8B,35B,8B,29B,8B,27B,8B,12B,8B,19B]
下面以排序后的第一数组(例如,Long型第一数组)为例,来说明对第一数组进行编码得到第一编码结果的过程:
首先需要说明的是,对于当前待编码的第一数组,可以预设仅需要关注高14bit的异或结果,也即最多有14位前导零,所以可以使用4个bit来存储该前导零数量。鉴于使用4个bit来放置前导零的编码结果,一个字节可以放置两个数字的前导零编码结果,因此将两个数字一组来进行编码。下面来说明对第一数组中数据(0,1)的编码过程。
(1)将Long型数组转换为字节数组[0x00,0x00,0x00,0x00],[0x00,0x00,0x00,0x01],……]。
(2)使用两个预测器来进行数值预测,其中,第一预测器可以采用如图4中所示的预测方法,初始预测值(predn)设为0;第二预测器可以采用如图5中所示的预测方法,初始预测值(predn)设为0。
将第一个数字[0x00,0x00,0x00,0x00]与第一预测器p1的初始预测值(例如,为0)做异或运算,得到异或结果diff 1d[0x00,0x00,0x00,0x00];同时,将第一个数字[0x00,0x00,0x00,0x00]与第二预测器p2的初始预测值(例如,为0)做异或运算,得到异或结果diff 2d[0x00,0x00,0x00,0x00]。两个异或结果相同的情况下,可以选择第一预测器p1的异或结果作为最终异或结果。
根据该最终异或结果和当前被预测值的真实值(此处为0)来更新第一预测器p1和第二预测器p2中的参数。具体地,分别更新预测器中的历史值表和预测值表。例如,第一预测器p1的预测值表的index的更新方式可以为:((lastIndex<<6)^(本次更新值>>48))&(table.length-1),其中,“lastIndex”为预测值表的上次index,“本次更新值”为本次input值,“table.length”为预测值表的长度。例如,第二预测器p2的预测值表的index的更新方式可以为:((dfcmHash<<2)^((trueValue-lastValue)>>40))&(table.length-1),其中,“dfcmHash”为本次index,“trueValue”为本次被预测值的真实值,“lastValue”为上一个值的真实值,“table.length”为预测值表的长度。
(3)将第二个数字[0x00,0x00,0x00,0x01]与更新后的第一预测器p1的预测值做异或运算,得到异或结果diff 1e[0x00,0x00,0x00,0x01];同时,将第二个数字[0x00,0x00,0x00,0x01]与第二预测器p2的初始预测值做异或运算,得到异或结果diff 2e[0x00,0x00,0x00,0x01]。两个异或结果相同的情况下,可以选择第一预测器p1的异或结果作为最终异或结果。
根据该最终异或结果和当前被预测值的真实值(此处为1)来更新第一预测器p1和第二预测器p2中的参数。
(4)第一个数字0的异或结果diff 1d[0x00,0x00,0x00,0x00],前导零的数量为8,在数据处理过程中,当前导零数量大于4时,进行减1处理,记zeroByteSize(0)=7;第二个数字1的异或结果diff 1e[0x00,0x00,0x00,0x01],前导零数量为7,记zeroByteSize(1)=6。对(0,1)的前导零进行编码,使用一个字节存储,将diff 1d左移4位放到高4bit,将diff1e放到低4bit,:code|=zeroByteSize(0)<<4|:code|=zeroByteSize(1),即,118B。
(5)然后,存放第一个数字和第二个数字的非前导零部分。具体地,对于数字0,非前导零部分无需存放;对于数字1,存放0000 00001,即,1B。
因此,数据(0,1)编码后的结果存储为字节数组[118B,1B]。重复循环上述步骤,可以得到第一编码结果。
以上提供了根据本公开的实施例的数据压缩方法,基于同样的思路,本说明书实施例还提供了与上述数据压缩方法对应的数据解压方法。
图8为本说明书实施例提供的一种数据压解压方法的流程示意图。
根据实施例,参照图8,一种数据解压方法包括以下步骤:
S210:获取压缩数据,所述压缩数据包括具有预设映射关系的第一压缩数据和第二压缩数据;
S220:基于所述第一压缩数据的数据特征,采用基于数值预测的编码方法对所述第一压缩数据解压缩,得到第一数组;
S230:基于所述第一压缩数据的数据特征,根据预设变长编码规则对所述第二压缩数据解压缩,得到第二数组;
S240:基于所述第一数组和所述第二数组,根据所述预设映射关系,得到解压数据。
根据实施例,所述基于所述第一数组和所述第二数组,根据所述预设映射关系,得到解压数据,具体包括:以所述第二数组中的元素的值作为位置索引,读取所述第一数组中的元素的值;将每次读取的所述第一数组中的元素的值存储,得到解压数组。
上面描述了本公开提供的数据压缩方法和数据解压方法,基于同样的思路,本说明书实施例还提供了上述数据压缩方法对应的装置以及与上述数据解压方法对应的装置。
图9为本说明书实施例提供的数据压缩装置的结构示意图。如图9所示,该数据压缩装置可以包括:
生成模块310,用于根据原始序列生成第一数组和第二数组,所述第一数组中的元素互不相同,且包含所述原始序列中的全部数值,所述第二数组中的元素是所述原始序列中的元素在所述第一数组中的位置索引;
第一编码模块320,用于采用基于数值预测的编码方法对所述第一数组进行编码,得到第一编码结果;
第二编码模块330,用于采用变长编码方法对所述第二数组进行编码,得到第二编码结果;
存储模块340,用于按照预设映射关系存储所述第一编码结果和所述第二编码结果。
图10为本说明书实施例提供的一种数据解压装置的结构示意图。如图10所示,该数据解压装置可以包括:
获取模块410,用于获取压缩数据,所述压缩数据包括具有预设映射关系的第一压缩数据和第二压缩数据;
第一数据解压模块420,用于基于所述第一压缩数据的数据特征,采用基于数值预测的编码方法对所述第一压缩数据解压缩,得到第一数组;
第二数据解压模块430,用于基于所述第一压缩数据的数据特征,根据预设变长编码规则对所述第二压缩数据解压缩,得到第二数组;
数据生成模块440,用于基于所述第一数组和所述第二数组,根据所述预设映射关系,得到解压数据。
基于同样的思路,本说明书实施例还提供了上述数据压缩和解压方法对应的设备。
图11为本说明书实施例提供的一种对应于数据压缩方法和数据解压方法的设备的结构示意图。如图11所示,一种数据处理设备500可以包括:
至少一个处理器510;以及,
与所述至少一个处理器通信连接的存储器530;其中,
所述存储器530存储有可被所述至少一个处理器510执行的指令520,所述指令被所述至少一个处理器510执行,以使所述至少一个处理器510能够:
根据原始序列,生成第一数组,所述第一数组中的元素互不相同,且包含所述原始序列中的全部数值;
根据所述原始序列,生成第二数组,所述第二数组中的元素是所述原始序列中的元素在所述第一数组中的位置索引;
采用基于数值预测的编码方法对所述第一数组进行编码,得到第一编码结果;
采用变长编码方法对所述第二数组进行编码,得到第二编码结果;
按照预设映射关系,存储所述第一编码结果和所述第二编码结果;
或者,
以使所述至少一个处理器510能够:
获取压缩数据,所述压缩数据包括具有预设映射关系的第一压缩数据和第二压缩数据;
基于所述第一压缩数据的数据特征,采用基于数值预测的编码方法对所述第一压缩数据解压缩,得到第一数组;
基于所述第一压缩数据的数据特征,根据预设变长编码规则对所述第二压缩数据解压缩,得到第二数组;
基于所述第一数组和所述第二数组,根据所述预设映射关系,得到解压数据。
上述对本说明书特定实施例进行了描述,在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书实施例提供的装置、设备与方法是对应的,因此,装置、设备也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、设备的有益技术效果。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。