LZ系列压缩算法编解码速度优化方法转让专利

申请号 : CN202210169115.8

文献号 : CN114244373B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李唯实谢明魏立峰张铎孙立明刘云

申请人 : 麒麟软件有限公司

摘要 :

本发明涉及一种LZ系列压缩算法编解码速度优化方法,数据编码时,一次性匹配长度为计算机字长的数据切片,减少匹配重复数据段所需的CPU周期数;累积未匹配数据并批量复制到编码输出缓存区,减少数据复制时所需的CPU周期数和额外开销;数据解码时,根据历史数据重复复制得到当前数据,若待复制数据长度小于当前位置跟历史数据位置之间的距离,直接批量复制;若大于,则采用循环批量复制的方式,历史数据位置保持不变,当前位置随着每次循环而更新,每次循环批量复制的数据长度均不大于当前位置跟历史数据位置之间的距离,减少数据复制时所需的CPU周期数和额外开销。本发明有效减少LZ系列压缩算法编解码时间,不降低算法的压缩率。

权利要求 :

1.一种LZ系列压缩算法编解码速度优化方法,包括对数据编码和数据解码两个过程的优化,其特征在于,在数据编码过程中,

查找重复数据段时,通过一次性读取多个字节的数据切片进行匹配的方式提升重复数据段的匹配速度,具体为:在查找重复数据段时,不再是逐个字节匹配,而是一次性读取长度为计算机字长的数据切片进行匹配,只有数据切片匹配失败时,才对数据切片进行逐个字节匹配,以减少查找重复数据段所需的CPU周期数;

输出未匹配数据时,通过累积未匹配数据并一次性批量输出的方式提升未匹配数据的输出速度,具体为:在输出未匹配数据时,不再是发现未匹配数据就立即输出,而是累积未匹配数据,直至发现下一个重复数据段后,才将累积的未匹配数据批量复制输出,减少复制所需的CPU周期数和额外开销。

2.一种LZ系列压缩算法编解码速度优化方法,包括对数据编码和数据解码两个过程的优化,其特征在于,在数据解码过程中,通过采用直接批量复制和循环批量复制的方式,提升根据历史数据重复复制得到当前数据的速度,具体操作为:在根据历史数据重复复制得到当前数据时,不再是逐个字节复制,而是综合考虑历史数据位置与当前位置的距离以及待复制数据长度,若待复制数据长度小于当前位置跟历史数据位置之间的距离,则直接批量复制;若待复制数据长度大于当前位置跟历史数据位置之间的距离,则采用循环批量复制的方式,历史数据位置保持不变,当前位置随着每次循环而更新,每次循环批量复制的数据长度均等于或小于当前位置跟历史数据位置之间的距离,以减少数据复制时所需的CPU周期数和额外开销。

3.根据权利要求2所述的LZ系列压缩算法编解码速度优化方法,其特征在于,数据解码时的历史数据重复复制得到当前数据,具体方式为:在数据解压过程中,当读取到数据为二元组(distance,length)时,则将按二元组(distance,length)中的信息,通过重复复制历史数据来得到当前数据,二元组(distance,length)中,distance代表历史数据位置与当前位置之间的相对距离,length表示以历史数据位置为起点、需要复制的数据的长度;

若二元组(distance,length)中的distance大于等于length,则直接采用memcpy函数完成数据的批量复制;

若二元组(distance,length)中的distance小于length,将采用循环批量复制的方式:在循环批量复制过程中,历史数据位置保持不变,当前位置随着复制过程不断后移,设d为复制过程中实时计算得到的当前位置和历史数据位置之间的距离,则d的初始值为distance,每次循环均采用memcpy函数复制d个字节长度的数据,并更新当前位置为数据段的尾部,根据新的当前位置重新计算得到d的值,当d的取值大于剩余待复制数据段长度后,结束循环,并采用memcpy函数完成剩余待复制数据段的批量复制。

说明书 :

LZ系列压缩算法编解码速度优化方法

技术领域

[0001] 本专利申请属于编解码技术领域,更具体地说,是涉及一种LZ系列压缩算法编解码速度优化方法。

背景技术

[0002] 云计算时代离不开对海量数据的处理和传输,海量数据的传输往往需要占用超大的网络带宽,且一旦数据传输上出现问题,将严重影响云计算中心的整体性能。为提高海量
数据的传输性能,往往需要在数据传输前进行数据压缩,通过有损/无损压缩算法来减少待
传输的数据总量。一般来说,数字、文本、合成图像以及医疗图像等数据往往采用无损压缩,
而自然图像、音频以及视频等数据则往往采用有损压缩。
[0003] 作为最常用的无损压缩算法,LZ算法通过用历史数据的相关信息来表示当前数据的方式实现数据压缩。具体而言,LZ算法在每处理一个当前输入数据时,均会借助于字典信
息找到之前处理过的、与当前输入数据的头部相匹配的数据段,并计算历史数据段与当前
数据段之间数据匹配的长度,当匹配长度大于阈值时,采用(与当前匹配位置的距离,匹配
长度)的二元组来替代当前输入数据,从而达到对输入数据压缩编码的效果。
[0004] 根据实际编解码过程和字典实现方式的不同,LZ编码可以分为LZ77、LZ78等多个分支,并形成了LZO、LZMA以及LZ4等众多无损压缩软件。这些软件均基于LZ编码的基本思
想,在各自实现上有所不同:如LZMA关注于压缩率的提高,具有最高的压缩比,但编解码时
间最长;LZ4充分利用了cache缓存,采用16k大小、能完全载入L1 cache的哈希表来储存字
典并简化检索,具有最快的编解码速度,但是这种速度的提升是以牺牲部分压缩率为代价
的;LZO则致力于实现压缩速度和压缩率之间的平衡,在确保压缩率的同时尽可能实现快速
压缩解压。
[0005] 在实际应用中,部分应用对于提升数据压缩时的编解码速度有着迫切的需求。例如:在Linux操作系统启动过程中,会加载临时根文件系统Initrd镜像并解压为Initrd文
件,Initrd镜像的解压速度对于Linux操作系统启动速度有着重要影响;在虚拟化领域的
spice云桌面协议中,spice需要实时将虚拟机中的桌面发送给客户端进行显示,在发送桌
面时,需要将桌面图像数据通过LZ算法进行数据压缩以便减少带宽压力,压缩算法的编解
码速度也会直接影响客户端的体验效果。若采用LZ4算法进行编解码的话,编解码速度基本
可以得到保证,但数据的压缩率降低也会带来其他方面的问题,因此,有必要在不影响压缩
率的前提下,对LZ系列算法包括LZ4算法的编解码速度进行进一步优化。
[0006] 现有技术的缺点
[0007] (1) 中国发明专利“一种基于低延时的LZ无损压缩算法的FPGA实现系统”(专利号:CN106385260A)。该专利公开了一种基于低延时的LZ无损压缩算法的FPGA实现系统,包
括输入缓存模块、输出缓存模块、移位寄存器、回读控制模块、匹配搜索模块、字符长度计算
模块、匹配长度计算模块和输出控制模块。该专利是针对现有无损压缩硬件实现方法的缺
陷,提供一种基于低延时的LZ(Lempel‑Ziv,即Ziv和Lempel算法)无损压缩算法的FPGA实现
系统,是通过硬件实现方式而不是软件方式来加速LZ无损压缩算法的编码速度,需要配置
专门的FPGA芯片,其使用范围受限,与现有系统和软件的集成效果还有待检验。
[0008] (2) 中国发明专利“一种用于变电站二次在线监测的LZ进化无损压缩方法”(专利号:CN105281874A)。该专利提供了一种用于变电站二次在线监测的LZ进化无损压缩方法,
在传输过程中建立“实时压缩字典”,并与变电站二次在线监测主站映像字典,从而在传输
过程中直接传输字典序列即可。变电站二次在线监测主、子站在通信建立时,先同步“实时
压缩字典”,再进行信息传输,而传输信息时大部分传输的是“实时压缩字典”中的序号,从
而降低所需的网络带宽,提高数据传输效率,保证数据可靠、实时传送。该专利需要预先建
立和同步“实时压缩字典”,适用于专用场景,而不适用于云计算的普遍场景。
[0009] (3)  中国发明专利“一种改进型LZ4压缩算法的硬件实现系统”(专利号:CN105207678A)。该专利利用硬件电路实现改进型LZ4压缩算法,可以发挥出该压缩算法的
最大性能,但该专利需要专用硬件电路的支持,且LZ4压缩算法的压缩率会比其他基于LZ变
体的压缩算法要差一些。
[0010] (4)中国发明专利“在基于LZ的压缩算法中在多个经压缩块之间共享初始词典和霍夫曼树”(专利号:CN105207678A)。该专利通过将数据字符串分割成块集,基于初始词典
集和霍夫曼树集压缩每一块的方式,可以采用并行方式进行数据压缩,提升了压缩速度,但
也因此可能导致压缩率会比其他基于LZ变体的压缩算法要差一些。同时,该专利在压缩前
需要预先生成初始词典和霍夫曼树,可能导致额外的计算开销。
[0011] (5) 中国发明专利“一种LZ编码的压缩方法、装置、设备及存储介质”(专利号:CN107565972A)。该专利致力于在异构并行加速平台下提高LZ编码的压缩率,但其代价是额
外的计算开销,增加了压缩时间。
[0012] (6) 美国发明专利“Literal handling in LZ compression employing MRU/LRU encoding”(专利号:US6218970B1)。该专利提供了一种在Lempel‑Ziv数据压缩系统中处理
文字的方法和系统,通过对字符的重新MRU/LRU编码排列来对lz编码进行优化。该方法适用
于对文本类型数据的压缩,但并不适用于图像、程序等其他类型数据的压缩。
[0013] (7) 国际发明专利“LEMPEL‑ZIV (LZ)‑BASED DATA COMPRESSION EMPLOYING IMPLICIT VARIABLE‑LENGTH DISTANCE CODING”(专利号:WO2015171263A1)。该专利采用隐
式变长距离编码的基于Lempel‑Ziv(LZ)的数据压缩。可以减少压缩输出数据中的距离位长
度,以进一步减小数据大小。但这种方式并不会减少压缩时间。
[0014] (8) 美国发明专利“Method, apparatus and system for data block rearrangement for LZ data compression”(专利号:US20060018556A1)。该专利提供了一
种为LZ数据压缩系统重新排列输入数据流以实现更高数据压缩的技术。它将每个接收到的
数据块与预定数量的先前处理的数据块中的每个进行比较,形成亲和数组,使得亲和数组
中的每个元素包括基于一个或多个匹配位置及其关联的匹配长度的亲和数;然后使用关联
数组重新排列输入数据流中的数据块序列,以形成新的数据流;最后对新数据流进行编码
以实现更高的数据压缩。该专利同样专注于实现更高的压缩率,但比较、重新排列以及重编
码等操作会带来额外的计算开销,需要更长的时间进行压缩操作。

发明内容

[0015] 本发明需要解决的技术问题是提供一种LZ系列压缩算法编解码速度优化方法,该方法可以在不借助额外硬件以及保证原有数据压缩率的前提下,有效提升LZ系列压缩算法
的编解码速度,从而减少诸如Linux系统启动和SPICE云桌面等实际应用花费在数据编解码
过程中的系统开销,提升实际应用的性能和执行效率。
[0016] 为了解决上述问题,本发明所采用的技术方案是:
[0017] 一种LZ系列压缩算法编解码速度优化方法,包括对数据编码和数据解码两个过程的优化,通过优化LZ系列算法的通用操作步骤,来实现算法编解码速度的提升,同时不影响
算法的压缩率。
[0018] 针对上述通用方法,本发明具体从以下几个方面对数据编解码步骤进行优化。
[0019] 在数据编码过程中,优化数据匹配阶段和未匹配数据输出阶段,具体为;
[0020] 查找重复数据阶段,每次匹配均是一次性读取长度为计算机字长的数据切片进行匹配;匹配失败的情况下,对匹配失败的数据切片进行逐字节匹配。
[0021] 进一步,在32位计算机系统中,计算机字长为4个字节;在64位计算机系统中,计算机字长为8个字节。一次性读取计算机字长长度的数据切片,可以最大限度利用计算机缓存
和减少读取数据所需的CPU周期数。
[0022] 输出未匹配数据时,累积未匹配数据,直到发现下一个重复数据段时,再采用memcpy函数批量将累积未匹配数据复制到编码输出缓存区。
[0023] 在数据编码过程中,针对LZ系列算法编码过程中步骤中的重复数据匹配阶段每个CPU周期只能完成1个字节的数据匹配的不足,优化方法充分利用处理器的字长,将每次匹
配优化成均是一次性读取长度为计算机字长的数据切片进行匹配,匹配失败的情况下,才
会对匹配失败的数据切片进行进一步的逐字节匹配,如此一来,每个CPU周期可以完成多个
字节的数据匹配,大大加快了数据匹配的速度。
[0024] 针对LZ系列算法中编码过程中的未匹配数据输出阶段所采用的一次复制指定数量字节到编码输出缓存区的方式,优化方法统一改为累积未匹配数据,直到发现下一个匹
配的重复数据段时再采用memcpy函数一次性将累积未匹配数据复制到编码输出缓存区,通
过这种方式,可以充分利用memcpy函数对内存数据复制所做的性能优化,加速未匹配数据
的输出。
[0025] 针对LZ系列算法解码过程的压缩段数据解压时只能逐个字节复制历史数据所造成的额外开销,将压缩段数据解压过程中的优化方法做了以下改进:
[0026] 首先、在数据解压过程中,当读取到数据为二元组(distance,length)时,则将按二元组(distance,length)中的信息,通过重复复制历史数据来得到当前数据,二元组
(distance,length)中,distance代表历史数据位置与当前位置之间的相对距离,length表
示以历史数据位置为起点、需要复制的数据的长度;
[0027] 然后,判断当前位置跟历史数据位置之间的距离distance是否大于等于length;
[0028] 若距离distance大于等于length,则直接采用memcpy函数完成数据复制;
[0029] 若距离distance小于length,则待复制的历史数据与复制后的数据之间存在数据重叠,直接采用memcpy函数进行批量复制将会产生数据错误。为了在避免数据错误的同时
尽可能利用memcpy函数在数据复制效率上的优势,将采用循环批量复制的方式:在循环批
量复制过程中,历史数据位置保持不变,当前位置随着复制过程不断后移;设d为复制过程
中实时计算得到的当前位置和历史数据位置之间的距离,则d的初始值为distance;每次循
环均采用memcpy函数复制d个字节长度的数据,并更新当前位置为数据段的尾部,根据新的
当前位置重新计算得到d的值,当d的取值大于剩余待复制数据段长度后,结束循环,并采用
memcpy函数完成剩余待复制数据段的批量复制。
[0030] 以上优化方法,因为并未改变算法的编解码原理,所以不会降低算法的压缩率;同时,以上优化方法优化了编解码过程中的执行步骤,有效减少了编解码所需的CPU周期,所
以可以有效减少编解码时间。
[0031] 由于采用了上述技术方案,本发明取得的有益效果是:
[0032] (1)本方法以纯软件方式来提升LZ系列压缩算法的编解码速度,同时还能保持算法压缩率不变。
[0033] (2)本发明的优化方法对LZ77、LZMA、LZO、LZ4等LZ系列的压缩算法均应是有效的,而不是仅仅只对某个具体压缩算法有效,确保了优化方法的算法通用性。
[0034] (3)本发明的优化方法对于x86_64、arm64等CPU平台架构下的LZ系列压缩算法均是有效的,确保了优化方法的平台架构通用性。
[0035] (4)本发明的优化方法,由于并未改变算法的编解码原理,所以不会降低算法的压缩率;同时,由于优化了编解码过程中的执行步骤,有效减少了编解码所需的CPU周期,所以
可以有效减少编解码时间,做到了压缩率和编解码的兼顾。
[0036] (5)本发明的优化算法的设计和实现都是自主设计研发,具有较强的自主可控性。
[0037] (6)本发明的优化算法效果明显,采用本发明的方案,可以在无需辅助硬件设备和不降低压缩率的基础上,有效提升LZ系列压缩算法的编解码速度。通过实验统计,对于除
LZ4外的LZ系列压缩算法如LZMA和LZO,本发明可以缩短30%‑50%的编码时间和50%‑60%的解
码时间;对于LZ4算法,本发明也可缩短10%的编码时间和15%的解码时间。

附图说明

[0038] 图1为本发明优化前的数据编码流程图;
[0039] 图2为本发明优化后的数据编码流程图;
[0040] 图3为本发明优化前的数据解码流程图;
[0041] 图4为本发明优化后的数据解码流程图。

具体实施方式

[0042] 下面结合实施例对本发明做进一步详细说明。
[0043] 本发明公开了一种LZ系列压缩算法编解码速度优化方法,在详细说明本发明的方案之前,先介绍一下本行业的缩略语和关键术语定义:
[0044] 数据压缩:数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗
余和存储的空间的一种技术方法。根据压缩过程中是否丢失了信息,数据压缩可以分为无
损压缩和有损压缩两类。
[0045] 无损压缩:无损压缩是利用数据的统计冗余进行压缩,可完全恢复原始数据而不引起任何失真,但压缩率是受到数据统计冗余度的理论限制,一般为2:1到5:1,这类方法广
泛用于文本数据,程序和特殊应用场合的图像数据(如指纹图像,医学图像等)的压缩。常用
的无损压缩主要有游程编码、哈夫曼编码、算术编码以及字典编码等类型。
[0046] 字典编码:字典编码的原理是构建一个字典,用索引来代替重复出现的字符或字符串,从而实现对数据的压缩。如果字符串相对长,那么对整个字符串构建字典,这个字典
将会很大,并且随着字典的增大,匹配速度也会快速下降。
[0047] LZ编解码:Lempel‑Ziv(LZ)编解码是最流行的无损存储算法之一,它基于字典压缩的思想,利用了字符串中上下文的相关性特点,通过一个滑动窗口(一个查找缓冲区)来
作为字典,对要压缩的字符串保留一个look‑aheadbuffer(前向缓冲存储器)。压缩后的字
符串采用三元组来表示:<位移,长度,下一个字符>,在滑动窗口中从后往前找,如果在窗口
中有曾经出现过的相同字符,看最多可以匹配多少字节,完了继续往前查找,查找完了取窗
口中最长的匹配串(如果有多个相同长度的串可以匹配,取最后一个),将这个匹配串距当
前位置的位移,长度,及下一个字符构成的三元组写出。如果在滑动窗口找不到匹配串,那
么位移=长度=0,加上不能压缩的字符一起输出。LZ算法最初于1977年由以色列人Jacob 
Ziv和Abraham Lempel提出,它可以解决字典匹配中的字典过大的问题,发展至今已经产生
了LZ77、LZ78、LZW、LZO、LZMA、LZSS、LZR、LZB、LZ4等众多变种。这些变种中,有些致力于提升
压缩率,如LZMA;有些致力于快速的压缩解压,如LZ4;也有些致力于平衡压缩率和编解码速
度,如LZO。
[0048] memcpy:memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin,void *source, unsigned n);函数的功能是从源内存地址的起始位置开
始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。如果
source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在
拷贝之前不被覆盖。当前glibc库中的memcpy已经针对各种平台架构进行了优化,可以确保
在x86、arm等平台架构上均能实现内存的快速拷贝。
[0049] 在介绍了上述缩略语和关键术语定义后,针对要解决的技术难题,本发明主要从LZ系列算法的通用操作流程中来进行优化,通过优化LZ系列算法的通用操作步骤,来实现
算法编解码速度的提升,同时不影响算法的压缩率。
[0050] 如图1,LZ系列压缩算法编码阶段的通用操作流程介绍如下:
[0051] 1)采用字典(各算法的字典实现方式并不相同)来缓存已输入数据的标识(通常为初始几个字节数据的hash值)和索引。通过标识,可以发现历史数据中是否已经有与当前输
入数据起始数据值相同的数据;通过索引,可以找到历史数据在内存中的位置。
[0052] 2)开始编码,将逐字节读取输入数据。
[0053] 3)读取一段数据(可以是一个字节,也可以是多个字节)。
[0054] 4)若在字典中没有找到与当前读取数据的hash标识相同的历史数据信息,则直接将当前读取数据复制到编码输出缓存区中(通常是采用一次复制1、4或8个指定数量字节),
并将读取指针跳转到当前数据段的下一个字节。
[0055] 5)若在字典中找到与当前读取数据的hash标识相同的历史数据信息,则计算历史数据与当前读取数据的匹配(相同)字节数(通常是逐个字节进行匹配)。
[0056] 6)若匹配(相同)字节数大于等于阈值,则用二元组(distance,length)作为压缩数据段来替代匹配长度的数据段输出到编码输出缓存区中,distance代表历史数据与当前
数据之间的相对距离,length表示历史数据与当前数据的匹配长度,也就是压缩数据段长
度值,并将读取指针跳转到匹配数据段的下一个字节。
[0057] 7)若匹配长度小于阈值,则将当前数据段复制到编码输出缓存区中(通常是采用一次复制1、4或8个指定数量字节),并将读取指针跳转到当前数据段的下一个字节。
[0058] 8)将当前读取数据的标识和索引信息更新到字典中。
[0059] 9)重复步骤3)到步骤8),直到所有输入数据均已读取完毕,输出编码输出缓存区中的数据,完成编码操作。
[0060] 如图3,LZ系列压缩算法解码阶段的通用操作流程介绍如下:
[0061] 1)开始解码,将逐字节读取待解码数据。
[0062] 2)读取一段数据,通过该段数据的标识位,来判断该段数据是需直接复制的数据段还是替代的二元组。
[0063] 3)若读取的数据段是需直接复制的数据段,则直接将该段数据复制到解码输出缓存区中。
[0064] 4)若读取的数据段是二元组(distance,length)代表的压缩数据段,则通过distance找到解码输出缓存区中distance个位置之前的历史数据位置,再将历史数据位置
开始的、长度为length的数据段复制到解码输出缓存区的当前位置的方式完成压缩数据段
的解压(此处的复制通常是采用逐个字节复制的方式来进行的。采用这种方式的原因在于
当从历史数据位置开始,若有length个字节的数据是重复的情况时,存在历史数据位置与
当前位置之间距离小于length的情况,这种情况下,采用memcpy函数或多个字节复制的方
式,会将当前尚未明确取值的字节也复制到了新的位置,导致解压数据错误)。
[0065] 5)重复步骤2)到步骤4),直到所有待解码数据均已读取完毕,输出解码输出缓存区中的数据,完成解码操作。
[0066] 针对上述LZ系列压缩算法的通用编解码流程,本发明将主要从以下几个方面对编解码步骤进行优化。
[0067] 比如本发明在数据编码过程中,在查找重复数据段时,通过一次性读取多个字节的数据切片进行匹配的方式提升重复数据段的匹配速度。在输出未匹配数据时,通过累积
未匹配数据并一次性批量输出的方式提升未匹配数据的输出速度。在数据解码过程中,通
过采用直接批量复制和循环批量复制的方式,提升根据历史数据重复复制得到当前数据的
速度。
[0068] 第一个,针对LZ系列算法编码过程中步骤5)的查找重复数据段时每个CPU周期只能完成1个字节这种数据匹配方面的不足,优化方法充分利用处理器的字长,不再是逐个字
节匹配,而是每次匹配均是一次性读取多个字节的数据切片进行匹配,一次性读取长度为
计算机字长的数据切片进行匹配,比如一次性读取4个字节(32位计算机)或8个字节(64位
计算机)的数据切片进行匹配,只有在数据切片匹配失败的情况下,才会对匹配失败的数据
切片进行进一步的逐字节匹配,如此一来,每个CPU周期可以完成4个字节(32位计算机)或8
个字节(64位计算机)的数据匹配,大大加快了数据匹配的速度,减少了查找重复数据段所
需的CPU周期数。
[0069] 第二个,针对LZ系列算法中编码过程中的步骤4)和步骤7)的输出未匹配数据所采用的一次复制指定数量字节到编码输出缓存区的方式,优化方法统一改为不再是发现未匹
配数据就立即输出,而是累积未匹配数据,直到发现下一个匹配的重复数据段时再采用
memcpy函数一次性将累积未匹配数据复制到编码输出缓存区,通过这种方式,可以充分利
用memcpy函数对内存数据复制所做的性能优化,加速未匹配数据的输出,减少复制所需的
CPU周期数和额外开销。
[0070] 第三个,针对LZ系列算法解码过程的步骤4)中压缩数据段解压时只能逐个字节复制历史数据所造成的额外开销,在数据解码过程中,通过采用直接批量复制和循环批量复
制的方式,提升根据历史数据重复复制得到当前数据的速度,具体操作为:
[0071] 在根据历史数据重复复制得到当前数据时,不再是逐个字节复制,而是综合考虑历史数据位置与当前位置的距离以及待复制数据长度,若待复制数据长度小于当前位置跟
历史数据位置之间的距离,则直接批量复制;若待复制数据长度大于当前位置跟历史数据
位置之间的距离,则采用循环批量复制的方式,历史数据位置保持不变,当前位置随着每次
循环而更新,每次循环批量复制的数据长度均等于或小于当前位置跟历史数据位置之间的
距离,以减少数据复制时所需的CPU周期数和额外开销。
[0072] 数据解码时的历史数据重复复制得到当前数据,具体方式为:
[0073] 在数据解压过程中,当读取到数据为二元组(distance,length)时,则将按二元组(distance,length)中的信息,通过重复复制历史数据来得到当前数据,二元组(distance,
length)中,distance代表历史数据位置与当前位置之间的相对距离,length表示以历史数
据位置为起点、需要复制的数据的长度;
[0074] 先判断二元组(distance,length)中的距离distance是否大于length值;
[0075] 若距离distance大于等于length,则直接采用memcpy函数完成数据的批量复制;
[0076] 若二元组(distance,length)中的distance小于length,则待复制的历史数据与复制后的数据之间存在数据重叠,直接采用memcpy函数进行批量复制将会产生数据错误。
为了在避免数据错误的同时尽可能利用memcpy函数在数据复制效率上的优势,将采用循环
批量复制的方式:在循环批量复制过程中,历史数据位置保持不变,当前位置随着复制过程
不断后移;设d为复制过程中实时计算得到的当前位置和历史数据位置之间的距离,则d的
初始值为distance;每次循环均采用memcpy函数复制d个字节长度的数据,并更新当前位置
为数据段的尾部,根据新的当前位置重新计算得到d的值,当d的取值大于剩余待复制数据
段长度后,结束循环,并采用memcpy函数完成剩余待复制数据段的批量复制。
[0077] 可以看出distance和d不是一个意义,本发明中,distance是一个固定值,而d是随着复制的进程,当前位置不断后移后重新计算得到的当前位置和历史数据位置之间的新的
距离,是一个变量。也就是循环批量复制时,先从历史数据位置开始采用完成distance个字
节的数据复制,再从历史数据位置开始完成2*distance个字节的复制,逐次增加,直到完成
length个字节的数据复制为止。通过改动,可以加速LZ系列算法解码过程。
[0078] 以上优化方法,因为并未改变算法的编解码原理,所以不会降低算法的压缩率;同时,以上优化方法优化了编解码过程中的执行步骤,有效减少了编解码所需的CPU周期,所
以可以有效减少编解码时间。
[0079] 所以,本方法具体包括以下步骤:
[0080] S1:数据编码
[0081] 1)改进数据匹配阶段的操作。充分利用处理器的字长,每次匹配均是一次性读取4个字节(32位计算机)或8个字节(64位计算机)的数据切片进行匹配,匹配失败的情况下,才
会对匹配失败的数据切片进行进一步的逐字节匹配;
[0082] 2)改进未匹配数据输出阶段的操作。充分利用memcpy函数对内存数据复制的所做的性能优化,累积未匹配数据,直到发现下一个匹配数据段时再采用memcpy函数一次性将
累积未匹配数据复制到编码输出缓存区。
[0083] S2:数据解码
[0084] 改进压缩数据段解压阶段的操作。若当前位置跟历史数据位置之间的距离大于等于压缩数据段长度,压缩数据段长度也就是历史数据与当前数据的匹配长度,则直接复制;
否则,采用memcpy函数循环复制的方式,在不复制未明确数据的内存区域的前提下,逐次逐
倍增加memcpy函数复制的数据长度,直到整个压缩数据段解压完毕。
[0085] 下面参照附图1‑4对本发明的实施例进行详细的说明,在描述过程中省略了对于本发明来说不必要的细节和功能,以防止对本发明的理解造成混淆。
[0086] 图1 图4是采用本发明所述优化方法前后的LZ系列压缩算法的流程对比图。其中~
图1、图3是优化前,图2、图4是优化后,优化后的最终流程如图2、图4所示。
[0087] 如图2所示的优化后的流程所示,本实施例如下:
[0088] S201:数据编码
[0089] 1)创建和初始化字典,初始化累积未匹配数据段起点;
[0090] 2)开始编码,将逐字节读取输入数据,根据读取数据段的hash标识在字典中查找hash标识相同的历史数据;
[0091] 3)若在字典中没有找到与当前读取数据的hash标识相同的历史数据信息,且累积未匹配数据段起点为空,则将累积未匹配数据段起点设为当前读取数据位置;
[0092] 4)若在字典中找到与当前读取数据的hash标识相同的历史数据信息,则开始计算历史数据与当前数据的匹配(相同)字节数,也就是二者之间的距离distance;
[0093] 5)每次分别从当前位置和历史位置读取一个long(64位)/int(32位)类型的数据进行比较,若两个数据相等,则匹配长度length增加8(64位)或4(32位),再读入下一个long
(64位)/int(32位)类型的数据;
[0094] 6)重复步骤5),直到读取的long(64位)/int(32位)类型的数据不相等为止,此时再在这两个不相等的数据所代表的内存区域之间,比较得到相等的字节长度,增加相等字
节长度到匹配长度中,结束数据匹配;
[0095] 7)判断匹配长度length是否大于阈值,若匹配长度length大于等于阈值,首先判断累积未匹配数据段起点是否为空,若不为空,首先将从累积未匹配数据段起点到当前位
置之间的内存数据通过memcpy函数复制到编码输出缓存区,并清空累积未匹配数据段起
点;然后再用(distance,length)二元组作为压缩数据段来替代匹配长度的数据段输出到
编码输出缓存区中;
[0096] 8)若匹配长度length小于阈值,且累积未匹配数据段起点为空,将累积未匹配数据段起点设为当前读取数据位置;
[0097] 9)将当前读取数据的标识和索引信息更新到字典中;
[0098] 10)重复步骤2)到步骤9),直到所有输入数据均已读取完毕,输出编码输出缓存区中的数据,完成编码操作。
[0099] 如图4所示的优化后的流程所示,本实施例如下:
[0100] S202:数据解码
[0101] 1)开始解码,将逐字节读取待解码数据;
[0102] 2)读取一段数据,通过该段数据的标识位,来判断该段数据是需要直接复制的数据段类型还是替代的二元组类型;
[0103] 3)若读取的数据段是需直接复制的数据段,则直接通过memcpy函数将该段数据逐字节复制到解码输出缓存区中;
[0104] 4)若读取的数据段是二元组(distance,length)代表的压缩数据段,则通过distance找到解码输出缓存区中distance个位置之前的历史数据位置,并根据distance与
length之间的关系选择数据复制方式;二元组(distance,length)中,distance代表历史数
据与当前数据之间的相对距离,length表示历史数据与当前数据的匹配长度;
[0105] 5)当distance>=length时,直接用memcpy函数,将历史数据位置开始的、长度为length的内存数据复制到解码输出缓存区,之后,跳转到步骤7);
[0106] 6)当distance再返回步骤5)进行复制;
[0107] 7)重复步骤2)到步骤6),直到所有待解码数据均已读取完毕,输出解码输出缓存区中的数据,完成解码操作。
[0108] 本方法可以有效提高包含LZ4在内的LZ系列压缩算法的编解码速度,不仅适用范围广,而且对压缩精度不造成影响。且由于优化算法的设计和实现都是自主设计研发,故具
有自主可控性强的特点。
[0109] 采用本发明的方案,可以在无需辅助硬件设备和不降低压缩率的基础上,有效提升LZ系列压缩算法的编解码速度。通过实验统计,对于除LZ4外的LZ系列压缩算法如LZMA和
LZO,本发明可以缩短30%‑50%的编码时间和50%‑60%的解码时间;对于LZ4算法,本发明也可
缩短10%的编码时间和15%的解码时间。
[0110] 本方法可以在不借助额外硬件以及保证原有数据压缩率的前提下,有效提升LZ系列压缩算法的编解码速度,从而减少诸如Linux系统启动和SPICE云桌面等实际应用花费在
数据编解码过程中的系统开销,提升实际应用的性能和执行效率。
[0111] 以上所述仅是本发明的优选实施方式,只是用于帮助理解本申请的方法及其核心思想,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属
于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原
理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。