一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于硬件快速实现GZIP压缩的方法及其应用与流程

2022-03-09 00:42:46 来源:中国专利 TAG:

一种基于硬件快速实现gzip压缩的方法及其应用
技术领域
1.本发明属于数据压缩领域,更具体地,涉及一种基于硬件快速实现gzip压缩的方法及其应用。


背景技术:

2.随着当前网络技术的不断发展,人类生产的数据量正在以指数级增长,基于网络的应用也日益增大,大量的数据需要在网络上传输,这样对数据的存储和传输提出了更高的要求。需要在有限的硬件资源条件下实现数据的存储并在有限的带宽下尽可能的传输更多的数据,所以在数据传输和存储之前对数据进行有效的压缩是非常有必要的。
3.gzip是一种无损压缩算法,首先使用lz77算法寻找上下文相匹配的字符串,对于存在匹配的字符串用长度距离对其进行替换,从而消除重复信息,然后使用哈夫曼算法构造平均长度最短的码流。在传统应用中,基于软件的解决方案被广泛应用于数据压缩和解压缩,但是大规模的数据压缩解压缩会消耗大量的cpu和内存资源,同时存在处理速率低的性能瓶颈,无法满足大数据环境下的实时压缩处理需求。


技术实现要素:

4.针对现有技术的缺陷和改进需求,本发明提供了一种基于硬件快速实现gzip压缩的方法及其应用,其目的在于降低cpu的资源利用率。
5.为实现上述目的,按照本发明的一个方面,提供了一种基于硬件快速实现gzip压缩的方法,其特征在于,包括:
6.将待压缩文本划分为不重叠的多个大小为m个字节的处理窗口;在一个时钟周期内,将当前处理窗口与其相邻的后一个处理窗口组成一个缓存窗口,从该缓存窗口中以当前处理窗口的每个字节为起始字节并往后文延伸构建长度为m的m个字符串,并同时计算所述m个字符串的哈希值;
7.在一个时钟周期内将所述m个字符串均匀存储到已在硬件上配置的k个单端口ram中,k取值为m的倍数;在存储每个字符串的同时读取与其具有相同哈希值的历史字符串,在下一个时钟周期内将每个字符串与对应读取的历史字符串逐字节匹配,得到每个字符串的匹配长度和匹配距离;
8.在一个时钟周期内,同步计算当前处理窗口对应的所述m个字符串的匹配延伸位置,计算方式为字符串的起始字节位置加上匹配长度,并选取匹配延伸位置最远的字符串作为当前处理窗口内的最优匹配字符串,将其它字符串中与最优匹配字符串发生匹配交叠的匹配部分修剪掉;对各处理窗口同步进行以下方式的懒惰匹配:对每个处理窗口的所述其它字符串,依序比较相邻两字符串的匹配长度,若前者大于后者,则将前者利用其匹配长度和匹配距离进行替换编码,并以同样方式比较以前者匹配延伸位置为起始字节的字符串与其相邻下一字符串的匹配长度;若前者小于后者,则对前者起始字节不处理,并以同样方式比较所述后者与其相邻下一字符串的匹配长度,直至遍历完成所述其它字符串,得到该
处理窗口对应的lz77压缩数据,其中,每个处理窗口的各次比较分配在不同的时钟周期内;
9.采用静态哈夫曼码表对lz77压缩数据编码,并经打包完成gzip压缩。
10.进一步,在每个字符串的存储过程中,将每个字符串哈希值的高n bit作为选择ram的索引,其中,n取值为:k=2n。
11.进一步,所述在一个时钟周期内将所述m个字符串均匀存储到已在硬件上配置的k个单端口ram中的过程中,对于需要访问同一个ram的多个字符串,在该ram中只存放位于前文的字符串。
12.进一步,对于每个地址的ram,采用三级缓存结构,当前的字符串存储到第一级缓存中,第一级缓存的输出存储到第二级缓存中,第二缓存的输出存储到第三级缓存中,以在哈希表项中存储多个哈希值相同的字符串。
13.进一步,在当前字符串的存储过程中,同时读取具有相同哈希值的三级缓存中的字符串,将当前存储的字符串与同时读取出的三个历史字符串进行逐字节匹配,得到三个候选的匹配长度和匹配距离,当三者的匹配长度都相同时,优先选择匹配距离最小的历史字符串用以记录当前存储的字符串的匹配长度和匹配距离;当三者的匹配长度不相同时,优先选择匹配长度最大的历史字符串用以记录当前存储的字符串的匹配长度和匹配距离。
14.进一步,若所述m个字符串存在多个匹配延伸位置相同的字符串,则将起始字节位置最小的字符串作为最优匹配字符串。
15.进一步,若当前处理窗口中的最优匹配字符串的匹配延伸至下一个处理窗口的字节位置,将当前处理窗口中最远延伸位置减去m作为下一个处理窗口开始进行最优匹配字符串选择的起始位置。
16.进一步,在一个时钟周期内采用m套静态哈夫曼码表分别对所述m个字符串对应的lz77压缩数据进行编码。
17.本发明还提供一种基于硬件快速实现gzip压缩的系统,包括k个单端口ram,其中,每个地址的ram采用三级缓存结构,还包括:
18.数据馈送模块,用于将待压缩文本划分为不重叠的多个大小为m个字节的处理窗口;在一个时钟周期内,将当前处理窗口与其相邻的后一个处理窗口传输至哈希值计算模块;
19.所述哈希值计算模块,用于执行如上所述的一种基于硬件快速实现gzip压缩的方法中的哈希值计算以及字符串的读写操作;
20.字符串匹配模块,用于执行如上所述的一种基于硬件快速实现gzip压缩的方法中的字符串匹配操作,得到每个字符串的匹配长度和匹配距离;
21.匹配修剪模块,用于执行如上所述的一种基于硬件快速实现gzip压缩的方法中的最优匹配字符串选取以及懒惰匹配,得到lz77压缩数据;
22.哈夫曼编码模块,用于采用静态哈夫曼码表对lz77压缩数据编码;
23.打包模块,用于对哈夫曼编码模块编码的数据打包,完成gzip压缩。
24.本发明还提供一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序被处理器运行时控制所述存储介质所在设备执行如上所述的一种基于硬件快速实现gzip压缩的方法。
25.总体而言,通过本发明所构思的以上技术方案,能够取得以下有益效果:
26.(1)本发明降低了cpu的资源利用率,将gzip算法的密集计算任务交给硬件处理。在不需要cpu参与的情况下,实现了的一种适配于软件的高带宽全流水可扩展无损压缩数据电路。
27.(2)通过引用并行处理窗口、重新设计哈希表项、匹配修剪算法解决算法间依赖和高速的比特流打包模块。在尽量不影响压缩率的同时提高压缩算法的吞吐率,满足大数据环境下实时压缩处理需求。
28.(3)本发明采用以下方法提高了吞吐率:将待压缩文本划分为多个大小为m字节的并行处理窗口,在一个时钟周期同时完成m个字符串哈希值计算;重新设计哈希表项ram的组织方式,为了在一个时钟周期同时完成对m个字符串存储和候选字符串的初步筛选,需要对哈希表项在单个时钟周期内进行m次读写,为了尽可能避免哈希表项访问冲突,采用2m个单端口ram构造哈希表项;设计匹配修剪算法消除并行处理窗口内和并行处理窗口间字符串匹配交叠,从而解决算法间依赖,改进了数据并行处理能力,将原有串行处理流程优化为适用于硬件的流水线结构提高数据吞吐率;为了更好的匹配前面lz77算法的流水结构,采用多个并行哈夫曼编码模块对字符、长度和距离进行编码。
29.(4)本发明采用以下方法提高了压缩率:采用k个ram的方式构成哈希表项解决ram的并行访问冲突,在单个时钟周期内完成哈希表项的k次读写。将字符串哈希值的n个比特作为选择ram的块号,k=2^n。不同字符串哈希值的n个比特可能相同,为了实现流水线数据通路,对于在同一个时钟周期需要访问同一个ram的多个字符串,只将字节起始最小位置的字符串作为ram的输入,其他字符串丢弃,这种丢弃策略导致丢失一些可能的候选位置,在压缩率上会有损失。因此成倍增加ram的个数,选择更多字符串哈希值的比特位作为选择ram块号的地址,尽可能避免ram的访存冲突;将软件实现的head-prev链表优化为多重哈希表设计,第一级哈希表包含哈希索引的最新位置,第二个哈希表包含第二个最新位置,第三个哈希表包含第三个最新位置。这种方法可以同时索引字典中具有相同哈希值的多个候选字符串,经过精细匹配后选出匹配长度最长的候选字符串;匹配修剪算法中采用懒惰匹配算法,对于当前字符串的匹配结果并不急于用长度距离二元组进行替换,而是将其与下一个相邻字符串匹配长度进行比较,如果下一个相邻字符串匹配长度更大,则当前字符串起始的字节作为一个未匹配处理,接着以同样的方式再处理下一个字符串;反之,用长度距离二元组替换当前字符串,懒惰匹配停止。从而在一个并行处理窗口中选择一个局部的最好匹配。
30.综上,本发明提出一种实现高带宽全流水无损压缩电路,相当于是一种gzip硬件加速器,可以显著降低cpu的占用,充分发挥硬件并行计算和流水线优势,以很小的压缩率损失为代价获得极高的处理效率。
附图说明
31.图1为本发明实施例提供的一种基于硬件快速实现gzip压缩的方法流程框图;
32.图2为本发明实施例提供的gzip压缩流水数据通路示意图;
33.图3为本发明实施例提供的并行窗口示意图;
34.图4为本发明实施例提供的哈希表项构建示意图;
35.图5为本发明实施例提供的哈希表项三级存储链示意图;
36.图6为本发明实施例提供的字符串精细匹配1示意图;
37.图7为本发明实施例提供的字符串精细匹配2示意图;
38.图8为本发明实施例提供的匹配交叠示意图;
39.图9为本发明实施例提供的最优匹配消除交叠示意图;
40.图10为本发明实施例提供的懒惰匹配消除交叠示意图。
具体实施方式
41.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
42.实施例一
43.一种基于硬件快速实现gzip压缩的方法,包括:
44.将待压缩文本按照字节划分为多个处理窗口,每个处理窗口的字节个数m与硬件能够并行处理字符串的长度相等;
45.在相邻多个位置同时进行哈希值计算,实现方式为:按照前后文顺序,在一个时钟周期内将当前处理窗口与其相邻的后一个处理窗口组成一个缓存窗口,从该缓存窗口中以当前处理窗口的每个字节为起始字节并往后文延伸构建长度为m的m个字符串;在该时钟周期内同时计算所述m个字符串的哈希值;
46.在一个时钟周期内将所述m个字符串均匀存储到已在硬件上配置的k个单端口ram中以构建哈希表项字典;其中,在存储过程中,将每个字符串哈希值的高n bit作为选择ram的索引,同时读取具有相同哈希值的历史字符串;k取值由m确定;将当前存储的字符串与读取的历史字符串逐字节匹配,得到当前存储的字符串的匹配长度和匹配距离;
47.在一个时钟周期内同步计算当前处理窗口对应的所述m个字符串的匹配延伸位置,计算方式为字符串的起始字节位置加上匹配长度,选取匹配延伸位置最远的字符串作为当前处理窗口内的最优匹配字符串,将其它m-1个字符串中与最优匹配字符串发生匹配交叠的匹配部分修剪掉;对所述其它m-1个字符串之间的匹配交叠进行消除,实现方式为:根据前后文依序将相邻两个字符串的匹配长度进行比较,若前者大于后者,则将前者利用其匹配长度和匹配距离组成的长度距离对进行替换,并以同样的方式将以前者匹配延伸位置为起始字节的字符串与其相邻的下一个字符串的匹配长度进行比较;若前者小于后者,则将前者起始字节位置作为一个未匹配字符处理,然后继续以同样的方式比较所述后者与其相邻的下一个字符串的匹配长度,直至完成所述其它m-1个字符串的遍历;
48.在一个时钟周期内采用m套静态哈夫曼码表分别对所述m个字符串对应的lz77压缩数据进行编码;将不定成的编码打包到字节边界上,并按gzip文件格式封装发送。
49.概况来讲,本方法将文本内容按照例如16个字节划分为一个处理窗口,其中处理窗口data_window0和data_window1的大小与之后并行处理字符串的长度有关,本实施例中并行处理窗口大小为16个字节。之后在一个时钟周期内计算处理窗口中16个字符串的哈希值,将哈希值作为ram的读写地址,把字符串内容及所在文本中的位置存储到哈希表项中。将字符串前三个字节计算的哈希值作为哈希链表的查找地址。将从ram中读取的候选字符
串和待处理字符串进行逐字节比较,计算待处理字符串和历史窗口中字符串的匹配长度和匹配距离。进一步进行匹配修剪,消除缓存窗口间和缓存窗口内字符串的交叠。进一步使用静态哈夫曼码表对lz77压缩的数据进行编码。最后则将不定成的编码打包到字节边界上,并按gzip文件格式封装发送。
50.具体来讲,将文本内容按照例如16个字节进行划分,每16个字节就是一个缓存窗口,记为data_window,则依次有data_window0,data_window1,data_window2等等。在多个位置同时进行哈希值计算,data_window0和data_window1组成一个32字节的缓存窗口,字节位置编码从0到31。一个时钟周期内同时处理16个字符串,字符串0是以字节地址0开始,延伸到字节地址15的位置;同理字符串15是以字节地址15开始,延伸到字节地址30的位置。
51.根据字符串的前三个字节计算哈希值,则一个时钟周期内同时计算16个字符串的哈希值,每个时钟周期同步处理16个字符串。哈希值计算模块有三种类型的ram,分别为hash_content_ram、hash_position_ram和hash_valid_ram,hash_content_ram的位宽是128比特,存储原始字符串内容;hash_position_ram的位宽是32比特,存储字符串起始字节在文本中的位置,hash_valid_ram的位宽是1比特,表征当前ram地址中存储内容是否有效。
52.由于一个时钟周期内处理16个字符串,需要对哈希表进行16次读写操作,对于单端口的ram存储结构,只能实现一个时钟周期读写一个地址。为了实现并行处理结构,必须做到一个时钟周期内对哈希表进行16次读写操作。所以采用多个ram方案解决访存ram冲突,本实施例中采用32个ram,将哈希值的高5bit作为访存ram的块号,其余比特作为ram内的偏移地址。选取适当的哈希函数产生随机分布的哈希值,将当前16个字符串的内容、位置和有效位均匀存储到对应类型的32个ram中。为了提高压缩率,字典中需要存储多个具有相同哈希值的字符串,经过字符串匹配选择一个最优的匹配。软件实现gzip压缩算法一般采用哈希链表的存储结构,哈希链表是一种串行的索引结构,为了发挥硬件并行性,采用三级存储模式,存储具有相同哈希值的字符串,其类似于一种移位寄存器,第一级存储距离当前字符串最近的位置,第二级存储距离当前字符串第二近的位置,第三级存储距离当前字符串第三近的位置。
53.在构建字典过程中,将第一级ram的输出作为第二级ram的输入,第二级ram的输出作为第三级ram的输入。在查找字典过程中,同时索引三级ram,得到三个候选的匹配字符串,hash_valid_ram的输出结果表征当前候选字符串是否有效。
54.字符串匹配是将待处理字符串与三个候选字符串进行逐字节比较,当两个待比较的字符串从起始位置开始有三个以上字节相同则认为存在匹配字符串,可以使用长度距离对将字符编码替换。
55.匹配修剪是不影响吞吐率的情况消除缓存窗口内和缓存窗口间的匹配交叠。在一个缓存窗口内多个连续字符串同时进行匹配查找会造成匹配重叠的冲突。上一个缓存窗口内某些字符串的匹配会延伸至下一个窗口,从而造成缓存窗口间的匹配交叠。匹配修剪对上述两种情况进行处理,经过修剪后的匹配可以作为lz77算法的编码输出。
56.哈夫曼编码是采用静态哈夫曼码表对lz77压缩后的结果进行二次压缩,进一步提高压缩率。为了更好的匹配前面lz77算法的流水结构,本实施例采用16个并行哈夫曼编码模块对字符、长度和距离进行编码。
57.比特流打包是将哈夫曼编码后的不定长编码打包到字节边界上。
58.优选的,在每个字符串的存储过程中,将每个字符串哈希值的高n bit作为选择ram的索引,其中,n取值为:k=2n。
59.优选的,在一个时钟周期内将m个字符串均匀存储到已在硬件上配置的k个单端口ram中的过程中,对于需要访问同一个ram的多个字符串,在该ram中只存放位于前文的字符串。
60.优选的,对于每个地址的ram,采用三级缓存结构,当前的字符串存储到第一级缓存中,第一级缓存的输出存储到第二级缓存中,第二缓存的输出存储到第三级缓存中,以在哈希表项中存储多个哈希值相同的字符串。
61.优选的,在当前字符串的存储过程中,同时读取具有相同哈希值的三级缓存中的字符串,将当前存储的字符串与同时读取出的三个历史字符串进行逐字节匹配,得到三个候选的匹配长度和匹配距离,当三者的匹配长度都相同时,优先选择匹配距离最小的历史字符串用以记录当前存储的字符串的匹配长度和匹配距离;当三者的匹配长度不相同时,优先选择匹配长度最大的历史字符串用以记录当前存储的字符串的匹配长度和匹配距离。
62.优选的,若m个字符串存在多个匹配延伸位置相同的字符串,则将起始字节位置最小的字符串作为最优匹配字符串。
63.优选的,若当前处理窗口中的最优匹配字符串的匹配延伸至下一个处理窗口的字节位置,将当前处理窗口中最远延伸位置减去m作为下一个处理窗口开始进行最优匹配字符串选择的起始位置。
64.优选的,在一个时钟周期内采用m套静态哈夫曼码表分别对所述m个字符串对应的lz77压缩数据进行编码。
65.实施例二
66.一种基于硬件快速实现gzip压缩的系统,如图2所示,包括k个单端口ram,其中,每个地址的ram采用三级缓存结构,还包括:数据馈送模块,哈希值计算模块,字符串匹配模块,匹配修剪模块,哈夫曼编码模块,以及打包模块。
67.数据馈送模块用于将待压缩文本划分为不重叠的多个大小为m个字节的处理窗口;在一个时钟周期内,将当前处理窗口与其相邻的后一个处理窗口传输至哈希值计算模块;哈希值计算模块用于执行如实施例一所述的一种基于硬件快速实现gzip压缩的方法中的哈希值计算以及字符串的读写操作;字符串匹配模块用于执行如实施例一所述的一种基于硬件快速实现gzip压缩的方法中的字符串匹配操作,得到每个字符串的匹配长度和匹配距离;匹配修剪模块用于执行如实施例一所述的一种基于硬件快速实现gzip压缩的方法中的最优匹配字符串选取以及懒惰匹配,得到lz77压缩数据;哈夫曼编码模块用于采用静态哈夫曼码表对lz77压缩数据编码;打包模块用于对哈夫曼编码模块编码的数据打包,完成gzip压缩。
68.概况来讲,数据馈送模块将文本内容按照例如16个字节划分为一个缓存窗口,其中缓存数据的窗口data_window0和data_window1的大小与之后并行处理字符串的长度有关,本实施例中并行处理窗口大小为16个字节。数据馈送模块与哈希值计算模块相连,哈希值计算模块在一个时钟周期内计算缓存窗口中16个字符串的哈希值,将哈希值作为ram的读写地址,把字符串内容及所在文本中的位置存储到哈希表模块中。哈希表模块实现字典的构建及查找,将字符串前三个字节计算的哈希值作为哈希链表的查找地址。字符串匹配
模块将从ram中读取的候选字符串和待处理字符串进行逐字节比较,计算待处理字符串和历史窗口中字符串的匹配长度和匹配距离。匹配修剪模块消除缓存窗口间和缓存窗口内字符串的交叠。哈夫曼编码模块使用静态哈夫曼码表对lz77压缩的数据进行编码。比特流打包模块则将不定成的编码打包到字节边界上,并按gzip文件格式封装发送。
69.具体来讲,所述的数据馈送模块是将文本内容按照例如16个字节进行划分,每16个字节就是一个缓存窗口,记为data_window,则依次有data_window0,data_window1,data_window2等等。数据馈送模块与哈希值计算模块数据位宽是32个字节,数据馈送模块的传输数据规则如下:第0时钟周期送入缓存窗口0和缓存窗口1,第1个时钟周期送入缓存窗口1和缓存窗口2,第2个时钟周期送入缓存窗口2和缓存窗口3,以此类推直至文件末尾。
70.哈希值计算模块是在缓存窗口中多个连续位置并行计算字符串的哈希值。如图3所示,缓存(并行处理)窗口0(所需吞吐率有关,时钟频率(硬件资源决定)和处理位宽(窗口越大,所需硬件资源越大),)和缓存窗口1一共是32个字节,可以划分为16个字符串,从字节位置0到字节位置15组成第0个字符串,从字节位置1到字节位置16组成第1个字符串,从字节位置2到字节位置17组成第2个字符串,以此类推,从字节位置15到字节位置30组成第15个字符串,每个字符串长度均为16个字节。选取每个字符串的前三个字节计算哈希值,在一个时钟周期内同时计算16个字符串哈希值,把哈希值的计算结果作为ram的索引地址,将字符串存储到哈希表中,从而构建了哈希表项。由于每个时钟周期同时处理16个字符串,就需要16次存储操作,因此采用32个单端口ram的方案,将16个字符串均匀存储到32个ram中。每个字符串哈希值的高5bit作为选择ram的索引,哈希值剩下的其它位作为该ram的读写地址。由于不同字符串计算出哈希值高5位可能相同,会出现在多个字符串需要同时访问同一个ram的冲突,为了不影响整体的处理速率,对于需要访问同一个ram的多个字符串,哈希表项只存放前面的字符串,对于它后面的字符串不参与建立字典的过程。如图4所示,字符串0和字符串2都需要同时访问ram0,只将字符串0存储到ram0中,丢弃字符串2所携带的信息。(窗口大小决定每个并行字符串大小,并行字符串个数,由字符串个数(哈希值个数) 哈希值高n位来确定ram个数,为了避免哈希值相同导致部分字符串不能存,为了尽可能将更多的字符串存入ram,以提高压缩率,n取值越大越好,带来的结果是ram越多,又存在成本问题,是一个折衷问题。ram分为三种类型,第一种类型为hash_content_ram,位宽是128bit,用于存储字符串的内容;第二种类型为hash_position_ram,位宽是32bit,用于存储字符串起始字节在文本中的位置;第三种类型为hash_valid_ram,位宽是1bit,用于表征对应ram存储的内容是否有效。三种类型的ram访存规则均如上文所述,这三种类型的ram是同步存储或者读取。假设某一个字符串计算的哈希值为13’b01100_0011_0111,首字节的位置是53,则哈希值的高5位是5’b01100,该字符串的内容存储到第12个hash_content_ram中;该字符串的位置53存储到第12个hash_position_ram中;标志位1写入到第12个hash_valid_ram中,这三种类型的ram写地址都是8’b0011_0111。
71.在构建字典的过程中,一个待压缩文本的不同位置会出现哈希值相同的字符串,为了提高压缩率,就需要在历史窗口中找到一个最优的匹配,因此在哈希表项中需要存储多个哈希值相同的字符串。本说明书中采用三级缓存结构(尽可能将具有相同哈希值的所有字符串都存到ram,提高压缩率),如图5所示。三级缓存类似于移位寄存器,新的字符串存储到第一级缓存中,第一级缓存的输出存储到第二级缓存中,第二缓存的输出存储到第三
级缓存中,这样哈希表项构建的历史字典就可以存储三个具有相同哈希值的字符串。
72.字符串匹配模块是将当前待处理字符串和候选字符串逐字节比较。哈希值计算模块是在构建字典,字符串匹配模块是在查找字典,在处理一个文本压缩的过程中,构建字典和查找字典是同步进行的。哈希值计算模块计算的字符串哈希值作为查找字典的地址,假设当前待处理某一个字符串的哈希值为13’b00011_0011_1111,则选择ram块号是5’b00011,读取第3个hash_content_ram地址为8’b0011_1111的值,得到候选字符串的内容;读取第3个hash_positon_ram地址为8’b0011_1111的值,得到候选字符串的位置;读取第3个hash_valid_ram地址为8’b0011_1111的值,如果读出的结果为1,则证明对应候选字符串是有效的,如果读出的结果为0,则证明对应候选字符串是无效的。本实施例中历史字典采用三级缓存存储三个具有相同哈希值的字符串,字符串匹配模块同时读取这三级缓存得到三个候选字符串,每一个候选字符串同步都与待处理字符串进行精细比较,得到对应的匹配长度和匹配距离。待处理字符串和候选字符串从起始字节开始匹配,对于匹配长度小于3的要舍去。如图6所示,当前待处理字符串和候选字符串前5个字节是一样的,第6个字节不一样,则计算出的匹配长度是5;如图7所示,当前待处理字符串和候选字符串的起始字节不一样,则计算出的匹配长度是0,待处理字符串和候选字符串要从起始字节开始匹配。两个字符串的匹配距离等于待处理字符串起始字节位置减去候选字符串起始字节位置。待处理字符串和候选字符串进行逐字节比较后,得到三个候选的匹配长度和匹配距离,当三者的匹配长度都相同时,优先选择匹配距离最小的候选字符串;当三者的匹配长度不相同时,优先选择匹配长度最大的候选字符串。经过字符串匹配模块处理后,原始待压缩文本的编码就变成了字符和长度距离对,对于在历史窗口中没有找到匹配字符串的位置用原始字符编码,对于有匹配字符串的位置用长度距离对编码。
73.匹配修剪模块是为了消除缓存窗口内和缓存窗口间的匹配交叠。经过前述几个模块处理后,待压缩文本被编码成原始字符或者长度距离对。如图8所示,为了图示简单明了,图8中缓存窗口大小为8个字节,每个时钟周期同步处理8个字符串,每个字符串大小为8个字节。字符串1、字符串2、字符串4和字符串7之间存在匹配交叠,在一个时钟周期内同步计算8个字符串的延伸位置,延伸位置(当前字符串匹配结束的位置,也就是下一个字符串可以开始处理的位置)计算规则为:字符串的首字节位置加上匹配长度,对于没有匹配的字符串其匹配长度(len)是1。字符串0的延伸位置是1,字符串1的延伸位置是5,字符串2的延伸位置是8,字符串3的延伸位置是4,字符串4的延伸位置是11,字符串5的延伸位置是6,字符串6的延伸位置是7,字符串7的延伸位置是12。选取延伸位置最远的字符串作为窗口内的最优匹配(如果几个字符串计算的延伸位置相同,那么将起始字节位置最小的字符串作为最优匹配),缓存窗口内其它字符串与最优匹配字符串发生交叠的部分都应该被修剪掉,经过修剪后的结果如图9所示。经过初步处理后缓存窗口内的最优匹配字符串和其他字符串之间消除了串扰,但是字符串1、字符串2和字符串4之间还存在匹配重复,为了解决上述冲突,本说明书提出懒惰匹配算法,变量strstart记录当前处理字节的位置,虽然以strstart为起始的字符串找到了最适合自己的匹配字符串,但是并不着急用长度距离对将其替换,用三个变量记录当前字符串的匹配长度、匹配位置和延伸位置,这三个变量就是match_len、match_position和reach_position。同时用变量processed_position记录在缓存窗口中已经处理到的字节位置。在处理以strstart 1为起始的字符串时,同样得到了匹配长度、匹配
位置和延伸位置,用match_len和当前字符串的匹配长度做比较,如果前者大于后者,则上一个字符串匹配长度大于这个字符串,那么懒惰匹配停止,上一个字符串用匹配长度(match_len)和匹配距离(mathc_position)组成长度距离完成替换,同时用变量processed_position记录选择的匹配字符串延伸位置,即将reach_position赋值给processed_postition。如果前者小于后者,那么用strstart 1为起始的字符串的匹配长度、匹配距离和延伸位置更新match_len、match_position和reach_position,strstart位置处的字符就作为一个未匹配字符来处理,即用原始字符进行编码。继续以同样的方式处理下一个相邻的字符串。如果当前处理字符串的起始字节位置小于缓存窗口中已经处理的字节位置(processed_position),则表明当前字节已经被前面的匹配字符串包括了,当前字节位置就不作任何处理,继续滑动字节位置处理下一个字符串。下面以一个具体实例说明懒惰匹配流程,以图9所示,在第0个时钟周期,开始处理字符串0,strstart是0,processed_position的初始值是0。由于在历史窗口中没有找到其对应匹配,match_len是0,reach_position是1。在第1个时钟周期,strstart滑动一个位置,即处理字符串1,strstart是1,match_len是4,reach_position是5。字符串1的匹配长度大于字符串0的匹配长度,strstart-1位置的字节用字符进行编码,更新processed_position的值为1,懒惰匹配继续进行。在第2个时钟周期,继续处理字符串2,此时strstart是2,match_len是5,reach_position是7,当前字符串的匹配长度大于上一个字符串长度,则字符串1的起始字节用字符编码,更新processed_position的值为2,懒惰匹配继续进行。在第3个时钟周期,继续处理字符串3,此时strstart是3,match_len是0,字符串2的匹配长度大于字符串3,懒惰匹配停止,将字符串2用长度距离对进行替换,同时用字符串2的reach_position更新processed_position,processed_position的值为7。在第4个时钟周期继续处理字符串4,由于字符串4的起始字节位置strstart为4,其值小于processed_position,则该字符串起始位置已经被前面匹配字符串覆盖了。同理字符串5和字符串6的起始字节位置均小于processed_position,均不作任何操作。在第7个时钟周期时,字符串7是缓存窗口0中的最优匹配,用长度距离将其替换,经过懒惰匹配后的结果如图10所示。寻找最优匹配和懒惰匹配两个步骤可以消除缓存窗口内的匹配冲突。
74.由图10可知,缓存窗口0中的字符串7的匹配已经延伸至缓存窗口1的第3个字节位置,造成缓存窗口间的匹配交叠,为了解决此类冲突,将上一个窗口中最远延伸位置减去缓存窗口大小作为下一个窗口开始比较匹配比较的起始位置,缓存窗口0中最远延伸位置是12,那么缓存窗口1开始处理字符串位置是4,即缓存窗口1中processed_position的初始值是4,字符串0~字符串3均不参加懒惰匹配过程。
75.哈夫曼编码模块是将匹配修剪模块产生的lz77编码输出作进一步压缩,哈夫曼编码模块采用静态哈夫曼码表对字符、长度和距离做映射。前面模块每个周期处理16个字节,为了更好的适配通路处理速率,哈夫曼编码模块采用16套静态哈夫曼码表同时对匹配修剪模块的输出进行编码。
76.比特流打包模块对哈夫曼的不定长编码通过一系列移位操作对齐到字节边界上。
77.实施例三
78.一种计算机可读存储介质,所述计算机可读存储介质包括存储的计算机程序,其中,在所述计算机程序被处理器运行时控制所述存储介质所在设备执行如实施例一所述的
一种基于硬件快速实现gzip压缩的方法。相关技术方案同实施例一,在此不再赘述。
79.本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献