掌桥专利:专业的专利平台
掌桥专利
首页

一种数据压缩方法、数据解压方法及装置

文献发布时间:2024-04-18 19:52:40


一种数据压缩方法、数据解压方法及装置

技术领域

本说明书一个或多个实施例涉及计算机技术领域,尤其涉及一种数据压缩方法、数据解压方法及装置。

背景技术

计算机中存储的数据较多,为了更好的节约存储资源和传输带宽,需要对数据进行压缩。而相关技术中,数据的压缩方法的压缩率仍不满足预期。

发明内容

有鉴于此,本说明书一个或多个实施例提供一种数据压缩方法、数据解压方法及装置。

根据本说明书一个或多个实施例的第一方面,提出了一种数据压缩方法,包括:

获取数据集合,并基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值;所述数据集合包括至少两个数据;

针对数据集合中每个未编码数据,执行:

将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中预设格式数值的数量;

生成索引字节和有效负载字节;所述索引字节包括:用于表征预设格式数值的数量的数据;所述有效负载字节为该未编码数据去除预设格式数值后剩余的数据;

将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;

针对数据集合对应的所有编码数据,通过删除重复字节的方式进行压缩,得到压缩后的数据。

根据本说明书一个或多个实施例的第二方面,提出了一种数据解压方法,包括:

恢复压缩数据集合中的重复字节,得到编码数据集合;所述压缩数据集合是通过上述的数据压缩方法对数据集合进行压缩得到的数据集合;

针对编码数据集合中每个编码数据,获取该编码数据对应的索引字节,并基于所述索引字节确定该编码数据对应的有效负载字节的字节数量;

基于确定的所述字节数量,从所述编码数据集合中读取该编码数据对应的有效负载字节;

基于获取的有效负载字节和所述索引字节,还原得到所述编码数据对应的异或值;

将该编码数据对应的预设值与该异或值进行异或处理,得到该编码数据对应的原始数据;

将所有原始数据进行组合,得到所述压缩数据集合对应的解压结果。

根据本说明书实施例的第三方面,提供一种数据压缩装置,包括:

数据集合获取模块,用于获取数据集合,并基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值;所述数据集合包括至少两个数据;

数据编码模块,用于针对数据集合中每个未编码数据,执行:将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中预设格式数值的数量;生成索引字节和有效负载字节;所述索引字节包括:用于表征预设格式数值的数量的数据;所述有效负载字节为该未编码数据去除预设格式数值后剩余的数据;将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;

数据压缩模块,用于针对数据集合对应的所有编码数据,通过删除重复字节的方式进行压缩,得到压缩后的数据。

根据本说明书实施例的第四方面,提供一种数据解压装置,包括:

编码数据集合获取模块,用于恢复压缩数据集合中的重复字节,得到编码数据集合;所述压缩数据集合是通过上述的数据压缩方法对数据集合进行压缩得到的数据集合;

编码数据解码模块,用于针对编码数据集合中每个编码数据,获取该编码数据对应的索引字节,并基于所述索引字节确定该编码数据对应的有效负载字节的字节数量;基于确定的所述字节数量,从所述编码数据集合中读取该编码数据对应的有效负载字节;基于获取的有效负载字节和所述索引字节,还原得到所述编码数据对应的异或值;将该编码数据对应的预设值与该异或值进行异或处理,得到该编码数据对应的原始数据;

原始数据组合模块,用于将所有原始数据进行组合,得到所述压缩数据集合对应的解压结果。

根据本说明书实施例的第五方面,提供一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现上述的数据压缩方法或数据解压方法。

根据本说明书实施例的六方面,提供一种计算机设备,所述计算机设备包括:

处理器;

用于存储处理器可执行指令的存储器;

所述处理器通过运行所述可执行指令以实现上述的数据压缩方法或数据解压方法。

根据本说明书实施例的七方面,提供一种计算机程序,所述计算机程序被处理器执行时实现上述的数据压缩方法或数据解压方法。

本说明书实施例提供了一种数据压缩方法、数据解压方法及装置,获取数据集合,并基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值;所述数据集合包括至少两个数据;针对数据集合中每个未编码数据,执行:将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中预设格式数值的数量;生成索引字节和有效负载字节;所述索引字节包括:用于表征预设格式数值的数量的数据;所述有效负载字节为该未编码数据去除预设格式数值后剩余的数据;将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;针对数据集合对应的所有编码数据,通过删除重复字节的方式进行压缩,得到压缩后的数据。

通过将预设格式数值的数量存储在索引字节中,并将有效负载以字节为单位进行存储,使得有效负载和预设格式数值的数量不会混合在一个字节中,从而使得数据集合中不同数据对应的编码后的数据重复率上升,使得编码后的数据的压缩率能得到提升。虽然稍微降低了通过编码方法进行压缩(即计算异或值、记录预设格式数值的数量和有效负载字节的过程)的压缩率,但是使得编码后的数据能更适合字节流压缩器处理,从而提高了两步整体的压缩率。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本说明书。

附图说明

此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本说明书的实施例,并与说明书一起用于解释本说明书的原理。

图1是本说明书根据一示例性实施例示出的一种数据压缩方法的流程图。

图2是本说明书根据一示例性实施例示出的一种编码数据存储方式的示意图。

图3是本说明书根据一示例性实施例示出的一种数据解压方法的流程图。

图4A是本说明书根据一具体实施例示出的一种数据压缩方法的示意图。

图4B是本说明书根据一具体实施例示出的一种数据解压方法的示意图。

图5是本说明书根据一示例性实施例示出的一种数据压缩装置的框图。

图6是本说明书根据一示例性实施例示出的一种数据解压装置的框图。

图7是本说明书根据一示例性实施例示出的一种数据压缩装置或数据解压装置所在计算机设备的一种硬件结构图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。

需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。

计算机设备中存储的数据有多种类型,目前的数据压缩率较低,接下来将以浮点数为例,来对相关技术中的浮点数压缩方法进行说明。

浮点数(floating-point)是一种具有小数部分的数字的计算机表示形式,浮点数一般分为单精度浮点数(占用4字节)和双精度浮点数(占用8字节)。相关技术中可以通过浮点数来表征时间序列。

随着物联网和自动驾驶汽车的发展,加强了对时间序列的存储需求。

针对用浮点数表征的时间序列,为了节省时间序列占用的存储空间或节省传输这些时间序列所需消耗的传输带宽,需要对浮点数集合(即时间序列)进行压缩,而相关技术中的压缩方法的压缩率还有提升空间。

接下来将对相关技术中的针对一组浮点数的压缩方法进行说明。

针对浮点数集合,相关技术中的一种压缩方法(Gorilla论文中提出的方法)如下:

第一,先存储浮点数集合中的第一个浮点数类型的数据。

第二,针对除了第一浮点数类型的数据之外的其他数据:

将二进制的该数据与该数据的前一个数据进行异或(exclusive OR,XOR)运算,得到运算结果。比如针对第二个数据,将第二个数据与第一个数据进行异或。

确定运算结果中前导零(leading zero)和尾随零(trialing zero)的数量,并确定运算结果中去除前导零和尾随零的中间有效负载的内容。

存储前导零、尾随零的数量以及有效负载的内容,将三者作为所针对的该数据的压缩结果。

举例来说,假设一个浮点数集合包括两个数据,二进制分别是10100000和111000000(浮点数类型的数据一般占用4个字节或8个字节,这里为了说明方便,以浮点数类型的数据占用一个字节举例,并不表明本申请中的浮点数类型的数据只占用一个字节),第二个数据和第一个数据进行异或后的运算结果为01000000,前导零的个数为1,尾随零的个数为6,那么浮点数集合的压缩结果可以是:第一个浮点数未压缩的结果,以及:前导零个数1、尾随零个数6和有效负载1(以二进制形式存储)。

由于两个字符串按位异或,针对每一位,在异或的两者相同的情况下会输出0,在异或的两者不同的情况下会输出1。这样,在浮点数集合中相邻两个浮点数较为相似的情况下,可以使得异或的运算结果中前导零和尾随零的数量较多、有效负载的内容较少,从而可以使得压缩后存储的内容较少,实现压缩。

但是发现:通过上述方法压缩后的一组浮点数,如果再将压缩后的一组浮点数输入其他字节流压缩器(比如zlib、zstd等等)的话,导致再输入字节流压缩器的压缩率较低,无法通过字节流压缩器进一步提高压缩率。

进行分析后发现,通过上述方法输入字节流压缩器后的压缩率低的原因在于:

字节流压缩器的压缩原理是:如果待压缩数据中有两个完全相同的字节,则删除其中一个字节,并记录被删除的字节的位置。换言之,字节流压缩方法一般都是以字节为单位来寻找相同的字节,并将寻找到的相同字节删除来节约空间。

而上述相关技术中的方案,字节与字节之间的重复率较低。究其原因,考虑到在对压缩后的数据进行存储时,前导零的个数、尾随零的个数和有效负载并不是按照字节进行存储的,而是不区分字节,在不同字节中连续存储上述数据,这导致每个字节中存储的内容是不确定的、且是没有规律的。

比如一个字节中可能前3个比特记录的是尾随零数量的一部分,后5个比特记录的是有效负载的一部分,但是另一个字节前5个比特记录的是前导零数量,后3个比特记录的是尾随零的数量。这样会降低了字节和字节之间的重复率。

换言之,上述方案以比特为单位对上述数据进行存储,使得压缩后数据的字节之间的重复率降低,从而使得压缩后的数据再输入字节流压缩器无法进一步提升压缩率。

为了解决上述问题,考虑到相关技术中的方法虽然压缩率较高,但是难以通过字节流压缩器进一步提高压缩率。考虑到可以稍微降低第一步的压缩率(即上述针对浮点数集合的压缩方式),使得字节与字节之间的重复率上升,这样,可以使得压缩后的数据可以进一步通过字节流压缩器来提升压缩率,这样使得两步联合(本方法降低压缩率的方法和第二步的字节流压缩器)的压缩率,相比于先通过相关技术中的方法进行压缩,再将压缩后的数据输入字节流压缩器的压缩率更高。

对于提高压缩后数据的字节的重复率的方法而言,相关技术中不管是统计前导零尾随零的数量,还是对压缩后的数据进行存储的时候都是以比特为单位来进行的。本说明书提供的方案中,为了提高重复率,以字节为单位来对不同部分(前导零字节数量、尾随零字节数量,和有效负载字节)的内容进行存储。

这样,相比于相关技术中的方式,将不同部分的内容按照字节进行存储,使得字节与字节之间的重复率上升。

比如两个数据对应的前导零、尾随零数量是一样的,但是相关技术中的存储方式,使得不同字节中存储的内容的含义是不同的,这样,即使他们的前导零尾随零数量是一致的,也不能提高字节之间的重复率。但是如果采用本说明书中提供的方法,每个字节中存储的内容的含义是有规律的,这样,在两个数据对应的前导零尾随零数量一致的情况下,使得存储前导零尾随零数量的字节之间也能一致,从而提升了字节与字节之间的重复率。

此外,还考虑到上述压缩方法不仅可以应用于浮点数类型的数据,也可以应用于其他类型的数据,因此本说明书提出了一种针对多种类型的数据的压缩方法。

还考虑到有些情况下,由于与数据进行异或的数据选取方式,使得异或值中可能并不具有前导零和尾随零,那么可以统计异或值中预设格式数值的数量(比如前面的1和后面的1的数量)从而达到更好的压缩效果。

通过上述方法完成压缩后,再将压缩完成的数据输入字节流压缩率,使得经过两次压缩的数据的压缩率得到了提升(相比于相关技术中的方式)。

本说明书实施例提供了一种数据压缩方法、数据解压方法及装置,获取数据集合,并基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值;所述数据集合包括至少两个数据;针对数据集合中每个未编码数据,执行:将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中预设格式数值的数量;生成索引字节和有效负载字节;所述索引字节包括:用于表征预设格式数值的数量的数据;所述有效负载字节为该未编码数据去除预设格式数值后剩余的数据;将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;针对数据集合对应的所有编码数据,通过删除重复字节的方式进行压缩,得到压缩后的数据。

通过将预设格式数值的数量存储在索引字节中,并将有效负载以字节为单位进行存储,使得有效负载和预设格式数值的数量不会混合在一个字节中,从而使得数据集合中不同数据对应的编码后的数据重复率上升,使得编码后的数据的压缩率能得到提升。虽然稍微降低了通过编码方法进行压缩(即计算异或值、记录预设格式数值的数量和有效负载字节的过程)的压缩率,但是使得编码后的数据能更适合字节流压缩器处理,从而提高了两步整体的压缩率。

接下来将对本说明书提供的一种数据压缩方法进行说明,如图1所示,图1是本说明书根据一示例性实施例示出的一种数据压缩方法的流程图,包括:

步骤101,获取数据集合,并基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值;所述数据集合包括至少两个数据。

具体而言,本说明书提供的方法是针对多个数据组成的数据集合的压缩方法,因此需要先获取需要进行压缩的数据集合。本说明书中的方法中需要将每个数据与预设值进行异或,所以需要先确定每个数据对应的预设值。

首先,对于该方法的执行主体而言,可以是由任何可以进行存储和计算的计算机设备来执行。也可以由多个计算机组成的系统来完成,本说明书对于该方法的执行主体不作限定。

对于该方法的应用场景而言,如前文所述,可以应用于以浮点数类型存储时间序列的数据库中,比如可以应用于存储时间序列的NoSQL中,当然,也可以应用于其他用于存储时间序列的数据库中。还可以应用于其他类型的数据对应的数据集合中,比如整数类型的数据等等。还需要说明的是,虽然本说明书中的方法是针对时间序列提出的,但是本说明书的方法不仅能应用于时间序列的压缩,也能应用于其他数据集合的压缩。虽然本说明书中的方法是针对浮点数类型的数据提出的,但是本说明书中的数据类型不限于浮点数类型,还可以是整数类型等其他类型。

接下来将对步骤101中涉及的名词进行说明。

数据集合也就是包括至少两个数据的集合,也即待进行压缩的数据集合,压缩时,该数据集合中的所有数据将一起被压缩。预设值设置规则也就是预先设置的用于设置预设值的规则,预设值如后文所述,也就是用于计算每个数据对应的异或值的数据。

其中,数据集合包括的数据可以为时间序列数据,比如可以是一定时间内传感器采集的数据、一定时间段内的车辆定位数据集合等等。当然数据集合除了用于表征时间序列之外,还可以是其他种类的数据,本说明书对于数据集合中的数据的含义不做限定。

对于预设值而言,为了得到更好的压缩效果,最好使得选取的预设值满足:将预设值和数据进行异或处理,异或结果中预设格式数值的数量尽可能多,这样使得有效负载字节的内容较少,从而能使得压缩后的数据集合较短。因此设置的预设值需要和数据集合中的数据相关。

比如,可以和相关技术中相似,将每个数据对应的预设值设置为:在数据集合中,该数据的上一个数据。这样在数据是表征时间序列的情况下,时间序列中相邻的两个采集值一般是两个相邻时刻的采集值,两个采集值是比较相似的,那这种情况下前导零数量和尾随零数量(预设格式数值的一种)较多,从而可以使得压缩后的有效负载字节较短。

此外,考虑到除了需要使得步骤103中异或值的有效负载字节较短以节省存储空间和传输带宽,还考虑到为了使得编码数据(即经过步骤103-107处理后的数据)不同字节之间的重复率较高。而考虑到相关技术中的方法中导致字节重复率较低的原因之一是如上文所述没有按照字节来存储不同部分的数据,二是将每个数据和相邻的数据进行异或,导致每个数据对应的异或结果都差别较大,导致重复的数据很少。

为了解决上述问题,考虑到在计算异或值时,可以不与相邻数据进行异或,而是所有数据都和相同的数据进行异或,这样,可以使得不同数据对应的异或值中,前导零数量和尾随零数量(预设格式数值的一种)相同,从而提升编码数据中字节之间的重复率(提高了不同索引字节之间的重复率)。换言之,还可以按照下述原则来设置预设值:设置固定的预设值,而且固定的预设值表达的含义和数据集合中的数据表达的含义有关。

比如数据集合中的所有数据对应的预设值可以为:数据集合中的第一个数据、最后一个数据或者是数据集合中的任一个数据。这样,所有数据对应的预设值都是相同的,这样,在数据集合中相邻的数据较为相似的情况下(比如数据集合存储的是时间序列,由于时间序列中相邻两个数值之间的采样时间接近,使得数据集合中相邻两个数据较为相似),可以使得相邻的数据对应的异或值也较为相似,那么相邻的数据对应的预设格式数值的数量和有效负载字节的重复率也随着相似,从而使得步骤107得到的编码数据能更适合被字节流压缩器压缩。

再比如,数据集合中所有数据对应的预设值还可以为:在数据集合中存储的是时间序列的情况下,如果时间序列用于表征具有某个含义的值(比如用于表征传感器测量得到的汽车在采样时间速度、传感器测量得到的室内温度等等),那么预设值可以选取为:该含义值的平均值。比如如果时间序列用于表征传感器测量得到的汽车在采样时间速度,汽车速度一般为80km/h(即平均值),那么可以将预设值设置为80km/h。这样,可以保证在预设值和数据集合中的数据有一定相似度的同时(使得预设值和数据集合的数据进行异或后的结果中有效负载字节较短),保证了数据集合中相邻的数据的异或值较为相似,从而使得字节重复率(索引字节和有效负载字节的重复率都上升)得到提高。

换言之,基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值,包括:基于预设值获取规则和获取的数据集合,获取预设的固定值;将预设的固定值作为所述数据集合中每个数据对应的预设值,并存储所述预设的固定值。

此外,上述方法中之所以需要存储该预设值,是因为需要使得解压时可以根据存储的预设值还原得到压缩前的数据。

其中,预设的固定值获取规则,可以是如上文所述,选取数据集合中的某个值作为数据集合中所有数据对应的预设值。换言之,基于预设的固定值获取规则,基于获取的数据集合获取预设的固定值,包括:将所述数据集合中的第N个值作为预设的固定值;所述N为预设正整数。

预设的固定值获取规则,还可以是先基于获取的数据集合,确定数据集合中表征的数值的含义,再将该含义的值的平均值作为预设的固定值。

针对数据集合中每个未编码数据,执行步骤103-步骤107:

步骤103,将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中预设格式数值的数量。

步骤105,生成索引字节和有效负载字节;所述索引字节包括:用于表征预设格式数值的数量的数据。

其中,所述有效负载字节为该未编码数据去除预设格式数值后剩余的数据。

步骤107,将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;

接下来将对步骤103-步骤107进行统一说明:

具体而言,上述步骤和相关技术中的压缩方法相似,只是本说明书提供的方法中,将不同部分的内容存储在了不同的字节中,这样可以提升字节之间的重复率。

接下来将对上述步骤中涉及的名词,以及各步骤的具体实现方式进行说明。

每个未编码数据指的是:未执行步骤103-步骤107的数据,也即未进行编码的数据。步骤107得到的编码数据,可以理解为通过上述方法完成第一步压缩的数据。本说明书中的压缩方法包括两步压缩,第一步压缩是步骤103-107中针对上述数据的编码方法,第二步压缩是步骤109中所采用的普通的压缩方法(即上文中的采用字节流压缩器的压缩方法)。如上所述,本说明书中的方法通过适当降低第一步压缩的压缩率,提高了数据集合对应的编码数据中的字节重复率,从而使得两步总体的压缩率相比于相关技术中的方法得到了提升。

需要说明的是,这里之所以称之为编码,是因为,压缩方法包括很多种,通过改变编码方法来实现压缩只是压缩方法的一种。本说明书中介绍的方法是通过改变了数据的编码方式,以实现压缩的效果。对于这种编码方法而言,对于单个数据而言可能并不能实现压缩方法。比如本来异或值中几乎不存在预设格式数值的数据,而且有效负载字节较多,有效负载字节占满了8个字节64位,通过上述可能会使得整体占用的字节变多(因此需要选取合适的预设值,保证有效负载字节尽可能少)。还需要说明的是,本说明书中所提及的编码方法,都是针对二进制的编码方法。

还需要说明的是,有些情况下会将数据集合中的某个数值作为预设值,这种情况下,数据集合中的作为预设值的数据不是未编码数据,无需对该数据执行步骤102-107。针对作为预设值的数据,可以直接将该数据进行存储,即该数据对应的编码数据为其本身。

相对应的,编码数据,就是每个未编码数据经过上述编码方法所得到的数据。

异或处理是一种相关技术中常见的处理,两个数据按位进行异或处理的情况下,针对每一位,如果两个数据的该位相同,则该位对应的异或结果为0,如果两个数据的该位不同,则该位对应的异或结果为1。

预设值和数据集合中每个数据进行异或处理后的结果在本说明书中称为异或值。

预设格式数值可以是前导零和/或尾随零,还可以是有效负载之前的1的数量和/或有效负载之前的1的数量(即从左往右,第一个0前面的1;从右往左,第一0前面的1),还可以是前导零和有效负载之后的1,或者是尾随零和有效负载之前的1等等,本说明书中对于预设格式数值的种类不作限定。

前导零(leading zero)即为:对于一个数据而言,从最高有效位(mostsignificant bit,MSB)开始往后直至遇到第一个非零数字,这个非零数字和最高有效位之间的0即为前导零。前导零也即对表征该数据大小无用的0,也即有效负载前面的0。需要说明的是,如上所述,本说明书的方法是针对二进制的数据进行说明的,前导零也即用于表征二进制的异或值中的前导零。

尾随零(trialing zero)即为:对于一个数据而言,从最低有效位(leastsignificant bit,LSB)开始往前直至遇到第一个非零数据,这个非零数字和最低有效位之间的0即为尾随零。同样,尾随零也是二进制的异或值中的尾随零。

计算异或值、统计预设格式数值的数量是为了实现压缩,如果直接对数据进行存储或者直接对异或值进行存储将无法实现压缩的效果,因此为了实现压缩的效果,通过计算异或值来增加需要存储的数据中预设格式数值的数量,而且对预设格式数值的数量进行统计,从而在存储的时候只需要存储预设格式数值的数量,而无需存储预设格式数值,从而使得编码数据相比于未编码数据而言,占用的存储空间更少。

在确定了预设格式数值的数量后,便可以在编码数据中设置索引字节,通过索引字节来存储预设格式数值的数量。除了存储预设格式数值的数量之外,还需存储中间的有效负载部分,有效负载部分即为异或值中去除了预设格式数值的部分。

接下来将对索引字节和有效负载字节的两种情况进行说明。

首先,索引字节中可以存储二进制的异或值中有多少位的预设格式数值(即预设格式数值占用多少比特),那么有效负载字节中存储的是去除预设格式数值的内容。如果有效负载部分不足一个字节或多个字节,那不足的地方可以补零处理。

此外,在数据的数据类型为双精度浮点数,且预设格式数值为前导零和尾随零的情况下,其占用8个字节(64比特),那么前导零和尾随零数量最大可能为64,由于需要不同部分以字节为单位来存储,那么针对前导零和尾随零,需要留出2个字节来分别存储前导零比特数和尾随零比特数,这样将会占用较多空间。

基于上述考虑,统计预设格式数值的数量不以比特为单位来统计,而是以字节为单位来统计,换言之,上述步骤103中确定该异或值中预设格式数值的数量,确定的是预设格式数值字节(比如前导零字节、尾随零字节、从最高有效位开始全是1的字节、从最低有效位开始全是1的字节)的数量。

其中前导零字节即该字节中包括的所有比特都存储的前导零的字节。一个字节(byte)包括8比特(bit,也称为8位),每一比特用于存储一个二进制的0或1。从另一个方面进行说明,前导零字节也就是:先确定距离MSB最近的存储1的比特所在字节,该确定的字节之前的字节即为前导零字节。尾随零字节也同理,为包括的所有比特都存储的是尾随零的字节。

相对应的,从最高有效位开始全是1的字节,即先确定距离MSB最近的存储0的比特所在字节,该确定的字节之前的字节即为从最高有效位开始全是1的字节,从最低有效位开始全是1的字节同理。

这样,由于双精度浮点数最多8个字节(基本大部分的数据类型都不会超过8个字节),那么前导零字节和尾随零字节的数量,以及从最高有效位开始全是1的字节和从最低有效位开始全是1的字节都不会超过8个。而8这个数字用四个比特就能表征(即二进制的1000),那么可以在一个字节(即索引字节只占用1个字节)中,前4位存储前导零字节的数量,后四位存储尾随零字节的数量(当然前导零字节数量和尾随零字节数量的存储顺序是其他顺序也可以,比如索引字节前两位和后两位用于存储前导零字节的数量,中间剩余四位用于存储尾随零字节的数量)。

此外,这样不仅能减少索引字节占用的存储空间,还能提升数据集合对应的编码数据的字节之间的重复率。具体而言,统计前导零字节和尾随零字节的数量,使得不同的压缩数据的预设格式数值的数量有更大可能相似。比如相关技术的方法中,数据1的运算结果中前导零有11比特,数据2的运算结果中前导零有12比特,11比特和12比特的值是不同的;但是如果按照本说明书的方法,按照前导零字节来统计,使得两者前导零字节的数量都为1,这样两者的前导零字节的数量是相同的,提高了存储的数据的重复率(有2个1)。

这种情况下,有效负载字节就是去除了前导零字节和尾随零字节后剩余的内容。

换言之,以所述预设格式数值为前导零和尾随零为例,所述确定该异或值中预设格式数值的数量,包括:确定该异或值中的前导零字节的数量和尾随零字节的数量,所述前导零字节用于表征字节中所有比特都为前导零的字节,所述尾随零字节用于表征字节中所有比特都为尾随零的字节。所述生成索引字节,包括:将所述前导零字节的数量和尾随零字节的数量编码到同一个字节中,作为索引字节。

通过上述方法,便生成了该未编码数据对应的索引字节和有效负载字节,这两者便构成了该数据对应的编码数据,也就完成了第一步的压缩。相较于相关技术中的方法,第一步的压缩虽然稍微降低了压缩率,但是提高了字节之间的重复率,使得编码数据能够更适合通过字节流压缩器进行压缩。

步骤109,针对数据集合对应的所有编码数据,通过删除重复字节的方式进行压缩,得到压缩后的数据。

具体而言,在完成了第一步压缩后,需要通过字节流压缩器完成第二步压缩(当然不使用现有的字节流压缩器,采用其他的通过删除重复字节的方法进行压缩也可以),以提高压缩率。如上所述,由于第二步的字节流压缩器实际上是以寻找重复的字节,并删除重复的字节来进行压缩,提高第一步压缩后数据的字节之间的重复率,可以使得第一步压缩后的数据能更适合被字节流压缩器压缩。虽然上述方法降低了第一步压缩方法的压缩率,但是如上所述,提高了第一步输出的不同未编码数据对应的编码数据之间的重复率,从而使得两步压缩组合的压缩率,相比于相关技术得到了提升。

其中,通过删除重复字节的方式进行压缩可以是通过字节流压缩器进行压缩,字节流压缩器也就是如上所述,通过删除重复字节进行压缩的压缩器。比如,字节流压缩器可以是Zlib压缩器、lzo压缩器、snappy压缩器、zstd压缩器中的任一种,当然,本说明书对于字节流压缩器的具体类型不做限定。当然通过删除重复字节的方式进行压缩也可以是通过其他方式进行的压缩。

所有的编码数据的存储方式可以是:分别存储每个数据对应的编码数据,比如可以按照以下顺序存储:数据集合中第一个数据(在预设值为第一个数据的情况下)、数据集合中第二个数据对应的索引字节、第二个数据中对应的有效负载字节、数据集合中第三个数据对应的索引字节、第三个数据对应的有效负载字节,以此类推。

此外,除了可以采用上述的编码数据的输出方式之外,还可以采用下述的编码数据输出方式来提高压缩率:考虑到字节流压缩器在删除重复字节时,还会把重复字节距离当前位置(当前位置的字节和删除的重复字节是相同的)记录下来,如果重复字节距离当前位置较远,且多个和当前位置的字节相同的重复字节较为分散,这样将会占用较多的空间。

而考虑到一般相邻的数据的索引字节可能是相同的,而有效负载字节也有可能是相同的,而相邻的数据的索引字节和有效负载字节一般是不同的。

因此,为了进一步提高字节流压缩器,可以将所有的编码数据的索引字节连续存储,所有的编码数据的有效负载字节连续存储(存储方式可以参见图2),这样使得输入字节流压缩器的数据中,相同的字节更可能是相邻的(比如如上所述,相邻的数据的索引字节很可能是相同的,相邻的数据的有效负载字节很可能是相同的),也即提升了小范围内的字节重复率。从而在删除重复字节后,存储删除的字节距离当前的位置时可以节约更多的时间。

换言之,步骤109具体包括:将所述数据集合中所有的数据对应的索引字节组成索引字节集合,并将所述数据集合中所有的数据对应的有效负载字节组成有效负载字节集合;将所述索引字节集合和所述有效负载字节集合输入字节流压缩器,得到压缩后的数据。

通过上述方法,第一,以字节为单位对不同的数据进行存储,这样使得不同字节之间存储的内容有规律可循,从而提升了编码数据中字节之间的重复率;第二,使用固定的值作为数据集合中所有数据对应的预设值,使得数据集合中不同的数据对应的异或值更可能相同,从而进一步提升了编码数据中字节之间的重复率;第三,在统计前导零和尾随零的数量时,也是以字节为单位进行统计,这样可以提升第一步压缩的压缩率,同时提升编码数据中字节之间的重复率;第四,输入字节流压缩器中的数据,是所有编码数据对应的索引字节存储在一起,所有编码数据对应的有效负载字节存储在一起,从而提升了输入字节流压缩器中的数据在小范围内的字节重复率,从而使得经过第二步压缩的压缩率得到提升。

通过上述方法,虽然降低了第一步压缩的压缩率,但是提升了第一步压缩后的所有编码数据的字节之间的重复率,从而使得第一步压缩后的编码数据能更适合被字节流压缩器压缩,从而使得两步压缩后的压缩率相比于相关技术得到提升。

本说明书还示出一种数据解压方法,如图3所示,图3是本说明书根据一示例性实施例示出的一种数据解压方法的流程图,包括:

步骤301,恢复压缩数据集合中的重复字节,得到编码数据集合。

所述压缩数据集合是通过上述的数据压缩方法对数据集合进行压缩得到的数据集合。

恢复重复字节可以采用上述的字节流压缩器对应的字节流解压器进行恢复。其中,字节流解压器用于将通过上述字节流压缩器压缩得到的数据进行对应解压,由于字节流压缩是通过删除重复字节,并记录被删除的重复字节的位置来完成压缩的,那么还原的时候,可以根据数据流中记录的数据以及被删除的重复字节距离当前的数据的位置来还原得到编码数据集合。具体的还原方法参见相关技术中的方法,本说明书在此不做限定。当然也可以采用其他方式进行恢复,本说明书对于压缩数据集合的恢复方法不作限定。

其中,编码数据集合中包括至少一个编码数据,编码数据也即为上述数据压缩方法中的数据。

针对编码数据集合中每个编码数据,执行步骤303-步骤309

步骤303,获取该编码数据对应的索引字节,并基于所述索引字节确定该编码数据对应的有效负载字节的字节数量。

索引字节中包括了预设格式数值的数量,比如可以是存储有前导零数量和尾随零数量;可基于预设格式数值的数量,用原始数据的总位数(比如双精度浮点数的总位数为64位,也即8字节)减去预设格式数值的数量,即得到有效负载字节的字节数量。

比如在索引字节中存储的是前导零的位数(即占用多少比特)和尾随零的位数,且该数据为双精度浮点数数据的情况下,可以用64位减去前导零和尾随零的数量和,得到的数即为有效负载占用的位数,由于有效负载是基于字节来存储的,如果有效负载占用的位数不是8的倍数(一个字节占8位),那么需要补足到8的倍数,比如如果有效负载为7位,那么即确定有效负载字节为1个字节(8位)。

比如在索引字节中存储的是前导零字节的数量和尾随零字节的数量,且该数据为双精度浮点数数据请的情况下,可以用8字节减去前导零字节和尾随零字节的数量和,即可以得到有效负载字节的字节数量。

预设格式数值为其他类型步骤303的实现方式也同理,在此不再赘述。

步骤305,基于确定的所述字节数量,从所述编码数据集合中读取该编码数据对应的有效负载字节。

在确定得到有效负载字节的字节数量后,便可以从编码数据集合中读取对应长度的有效负载字节。比如在编码数据集合中,每个原始数据对应的索引字节和有效负载字节连续的情况下,可以在索引字节后,读取相应长度的字节作为有效负载字节。

步骤307,基于获取的有效负载字节和所述索引字节,还原得到所述编码数据对应的异或值。

得到索引字节和有效负载字节后,便可以在有效负载字节前后添加上对应数量(记录在索引字节中)的预设格式数值,得到编码数据对应的异或值。

步骤309,将该编码数据对应的预设值与该异或值进行异或处理,得到该编码数据对应的原始数据。

步骤311,将所有原始数据进行组合,得到所述压缩数据集合对应的解压结果。

这样,就能对通过上述的数据压缩方法得到的压缩数据集合进行解压处理。

接下来将通过一具体实施例对本说明书示出的一种浮点数压缩方法进行说明。

针对浮点数集合的压缩方法参见图4A,包括以下步骤:

第一,获取浮点数集合。浮点数集合中如图4A所示,包括第一个浮点数类型的数据和剩余的浮点数类型的数据。这个浮点数集合中包括的数据将一起被压缩。浮点数集合中存储的若干双精度浮点数类型的数据。

第二,直接存储第一个双精度浮点数类型的数据,不对该数据进行压缩。

第三,对于剩余的双精度浮点数类型的每个数据:将该数据与第一个双精度浮点数类型的数据进行异或处理,确定异或结果(异或值)中前导零字节和尾随零字节的数量。

第四,将该数据的前导零字节数量和尾随零字节数量编码至一个索引字节中(opencoder)。该索引字节中,前四位存储前导零字节的数量,后四位存储尾随零字节的数量。

第五,输出该数据对应的索引字节(通过上述步骤第四得到)进而有效负载字节,有效负载字节是异或值去除前导零字节和尾随零字节的部分。

第六,输出浮点数集合对应的编码浮点数集合,编码浮点数集合如图4A所示,包括三个部分,分别是:第一个浮点数类型的数据,索引字节集合(包括浮点数集合中所有数据对应的头部数据)和有效负载字节集合(包括浮点数集合中所有数据对应的有效负载字节)。

第七,将浮点数集合对应的编码浮点数集合输入字节流压缩器(byte-streamcompressor),得到浮点数集合对应的压缩结果。

这样就完成了双精度浮点数类型的数据的压缩。

对于压缩方法而言,相比于相关技术中的方法,第一,本说明书中提供的方法中使用了固定值(上述例子中的浮点数集合中的第一个双精度浮点数类型的数据)作为预设值,而相关技术中是将与当前数据相邻的数据作为预设值,本说明书中通过将固定值作为了预设值,从而使得不同数据对应的异或值(预设值和不同数据的异或结果)更为相似,提高了浮点数集合对应的编码数据的重复率。

第二,本说明书中没有在一个字节中存储不同的内容,而是将预设格式数值的数量和有效负载存储在了不同字节中,这样,在提高了浮点数集合对应的编码数据的重复率的同时,使得字节之间的重复率得到了提升。

第三,本说明书中统计的是以字节为单位的预设格式数值的数量(比如前导零字节和尾随零字节的数量),这样使得不同编码数据对应的索引字节之间的重复率得到了提升。

通过上述三点的配合,使得所有编码数据对应的字节之间的重复率得到了提升,这样,使得这些数据更适合输入字节流压缩器。虽然上述三点的配合,使得编码过程的压缩率下降,但是由于这些数据更适合输入字节流压缩器,使得两步压缩(编码的过程和输入字节流压缩器)总体的压缩率得到了提升。

与之对应的,本说明书还提供一种浮点数解压方法,浮点数解压方法的示意图可以参见图4B,包括以下步骤:

第一,获取压缩浮点数集合。

第二,通过字节流解压器对压缩浮点数集合进行解压,得到编码浮点数集合。

如图所示,编码浮点数集合包括三部分,分别是第一个浮点数类型的数据、有效负载字节集合和索引字节集合。

第三,对每个索引字节(占用一个字节)进行处理,得到每个编码数据对应的前导零字节数量和尾随零字节数量,并基于前导零字节数量和尾随零字节数量确定有效负载字节的字节数量。

第四,基于确定的每个编码数据对应的有效负载字节的字节数量,从有效负载字节集合中读取每个编码数据对应的有效负载字节。

第五,基于索引字节和有效负载字节还原每个编码数据对应的异或值。

比如索引字节中记录有1个前导零字节、2个尾随零字节,有效负载字节为10100000(假设每个浮点数类型的数据都是单精度浮点数),那么还原得到的异或值为:00000000 1010000000000000 00000000.。

第六,将每个异或值与第一个浮点数类型的数据进行异或,还原得到浮点数集合中除第一个数据之外的其他数据,得到解压结果。

与前述方法的实施例相对应,本说明书还提供了装置及其所应用的终端的实施例。

如图5所示,图5是本说明书根据一示例性实施例示出的一种数据压缩装置的框图,所述装置包括:

数据集合获取模块510,用于获取数据集合,并基于获取的数据集合和预设值设置规则,确定所述数据集合中每个数据对应的预设值;所述数据集合包括至少两个数据类型的数据;

数据编码模块520,用于用于针对数据集合中每个未编码数据,执行:将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中预设格式数值的数量;生成索引字节和有效负载字节;所述索引字节包括:用于表征预设格式数值的数量的数据;所述有效负载字节为该未编码数据去除预设格式数值后剩余的数据;将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;

数据压缩模块530,用于针对数据集合对应的所有编码数据,通过删除重复字节的方式进行压缩,得到压缩后的数据。

在一可选实施例中,所述数据集合获取模块510,用于获取数据集合,基于预设值获取规则和获取的数据集合,获取预设的固定值;将预设的固定值作为所述数据集合中每个数据对应的预设值,并存储所述预设的固定值。

在一可选实施例中,所述数据集合获取模块510,用于获取数据集合,将所述数据集合中的第N个值作为预设的固定值;所述N为预设正整数。将预设的固定值作为所述数据集合中每个数据对应的预设值,并存储所述预设的固定值。

在一可选实施例中,所述预设格式数值为前导零和尾随零;所述数据编码模块520,用于针对数据集合中每个未编码数据,执行:将该未编码数据与该未编码数据对应的预设值进行异或,得到该未编码数据对应的异或值,并确定该异或值中的前导零字节的数量和尾随零字节的数量,所述前导零字节用于表征字节中所有比特都为前导零的字节,所述尾随零字节用于表征字节中所有比特都为尾随零的字节;生成索引字节和有效负载字节;所述索引字节包括:用于表征前导零字节的数量和尾随零字节的数量的数据;所述有效负载字节为该未编码数据去除前导零字节和尾随零字节后剩余的数据;将生成的索引字节和有效负载字节作为该未编码数据对应的编码数据;

在一可选实施例中,数据压缩模块530,用于将所述数据集合中所有的数据对应的索引字节组成索引字节集合,并将所述数据集合中所有的数据对应的有效负载字节组成有效负载字节集合;将所述索引字节集合和所述有效负载字节集合输入字节流压缩器,得到压缩后的数据。

在一可选实施例中,所述数据压缩模块530,用于针对数据集合对应的所有编码数据,通过以下任意一种字节流压缩器进行压缩,得到压缩后的数据;字节流压缩器包括以下任一种:Zlib压缩器、lzo压缩器、snappy压缩器、zstd压缩器。

在一可选实施例中,所述数据集合包括的数据为时间序列数据。

如图6所示,图6是本说明书根据一示例性实施例示出的一种数据解压装置的框图,所述装置包括:

编码数据集合获取模块610,用于恢复压缩数据集合中的重复字节,得到编码数据集合;所述压缩数据集合是通过上述的数据压缩方法对数据集合进行压缩得到的数据集合;

编码数据解码模块620,用于针对编码数据集合中每个编码数据,获取该编码数据对应的索引字节,并基于所述索引字节确定该编码数据对应的有效负载字节的字节数量;基于确定的所述字节数量,从所述编码数据集合中读取该编码数据对应的有效负载字节;基于获取的有效负载字节和所述索引字节,还原得到所述编码数据对应的异或值;将该编码数据对应的预设值与该异或值进行异或处理,得到该编码数据对应的原始数据;

原始数据组合模块630,用于将所有原始数据进行组合,得到所述压缩数据集合对应的解压结果。

上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

如图7所示,图7示出了实施例数据压缩装置或数据解压装置所在计算机设备的一种硬件结构图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。

处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。所述处理器通过运行可执行指令以实现上述的方法。

用于存储处理器可执行指令的存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random Access Memory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,

输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。

通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。

总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。

需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。

本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的数据压缩方法或数据解压方法。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

本说明书实施例还提供一种计算机程序,该程序被处理器执行时实现上述的数据压缩方法或数据解压方法。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

技术分类

06120116335848