一种基于梯度下降的tANS编码、解码转换表快速建立方法
技术领域
本发明属于编码领域,具体是一种基于梯度下降的tANS编码、解码转换表快速建立方法。
背景技术
随着大数据时代的来临,在物联网、人工智能等特定应用领域,对海量数据处理的低时延性要求不断提高,无损数据压缩技术也越来越重要。无损数据压缩按压缩原理可分为基于数据统计的算法和基于字典的算法,其中,基于数据统计的算法包括Shannon-Fano编码、Huffman编码、算术编码(arithmetic coding,AC)、游程编码(run lengthcode,RLE)和有限状态熵编码(finite state entropy,FSE)等,基于字典的算法包括LZ77(Lempel-Ziv77)编码和LZ78(Lempel-Ziv 78)编码等。
在Huffman编码和算数编码进行了近半个世纪的较量后,一种新的统计编码方法出现了,并且似乎能替代他们。
2007年,Jarek Duda提出了一种新的基于信息论的数据压缩方法:非对称数字***(asymmetric numeral systems,ANS)这种新型的压缩编码方法是一种精确的熵编码方法,得到字符的编码结果可以无限逼近最优熵值,它在压缩率可以近乎于算术编码的同时,编码效率又能接近Huffman编码。它既可以用于精确编码,又可以用于快速编码,并且压缩后的数据具有数据加密功能。使用ANS代替更为传统的Huffman和算术编码方法的压缩库越来越多,目前流行的Zstandard就是其中之一。
tANS编码是ANS编码的一种变体方法,它的编码解码工作的展开都是围绕着一张表格建立的。这个表格如何建立是tANS编码方法的关键所在,而目前对于tANS编码中表格建立鲜有研究。
发明内容
本发明针对背景技术中存在的问题,为满足特定应用领域对压缩性能日益增长的需求,本文针对tANS编码方法中的FSE展开研究,采用软硬件协同实现的方式,全面提高Zstandard算法的压缩和解压的速度。按照Zstandard规范标准,提出了适于硬件实现的FSE压缩和解压架构设计方案,从而有效地减少硬件开销和提高硬件利用率。实验结果表明,所提出的FSE硬件实现架构,对Zstandard硬件加速设计与实现的解决方案具有理论研究的前瞻性、可行性,以及现实的应用价值。
技术方案:
一种基于梯度下降的tANS编码、解码转换表快速建立方法,它包括以下步骤:
S1、统计数据块中各字符出现的频数,并排序;
S2、确定tANS转换表的形状:tANS转换表的行表头为已排序的各字符;tANS转换表内容为每个字符待填入的状态值,tANS转换表内容的行数为每个字符需要的状态数Nstate;
S3、给tANS转换表填入初始的状态值,获得初始的tANS转换表;
S4、基于初始的tANS转换表,扩列建立状态数值展开表;
S5、基于状态数值展开表,计算状态数值频数;
S6、根据状态数值频数更新状态值;
S7、根据状态值更新结果,生成新的tANS转换表。
优选的,S2中,字符A需要的状态数量Nstate(A)通过下式求得:Nstate(A)=PA*Vmax,Vmax表示状态值的上限,PA为字符A出现的频率。
优选的,Vmax通过下式获得:
式中,Nsymbol为数据块中统计的字符的总数;表示向下取整,C的值根据具体数据特点及压缩要求选择。
优选的,S3中,初始的状态值Vstate(n,A)通过下式获得:
其中,Vstate(n,A)表示初始tANS转换表中,字符A所属的列中第n行元素的初始状态值,PA为字符A出现的频率。
优选的,S4中,状态数值展开表的建立具体包括以下步骤:
S4-1、在初始tANS转换表的行表头中增加表头“状态数值”;
S4-2、在“状态数值”所属列的元素中,顺次填入自然数:1、2、……、Vmax,Vmax为tANS转换表中的状态值上限;
S4-3、补入状态数值展开表中的行列内容:
初始的状态值Vstate(n,A)=B,则状态数值展开表中元素(B,A)=B,(B,A)表示行号为自然数B,列号为字符A所对应的元素。
优选的,S5中,状态数值频数的计算包括以下步骤:
S5-1、在状态数值展开表的行表头中增加表头“状态数值频数”;
S5-2、统计每一行中出现元素的次数,记作状态数值频数;
S5-3、在“状态数值频数”所属的列元素中,填入相应的状态数值频数。
优选的,S6具体包括:
S6-1、定位状态数值频数大于1的行;
S6-2、计算该行的梯度;
S6-3、根据梯度调整状态值;
S6-4、根据状态值更新状态数值频数;
S6-5、迭代S6-1至S6-4,直至所有状态数值频数≤1。
具体的,S6-2中,梯度定义为:
上梯度Gu(n)=F(n)-F(n-1);
下梯度Gd(n)=F(n)-F(n+1);
其中,F(n)表示状态数值n所映射的状态数值频数,F(n±1)表示状态数值n±1所映射的状态数值频数。
具体的,S6-3具体步骤是:
①若Gu(n)>Gd(n),则选择该行中1个初始的状态值Vstate(n,m)向上纵移1行,并修正该初始的状态值Vstate(n,m)为n+1;m表示任一字符m所属的列;
②若Gu(n)<Gd(n),则选择该行中1个初始的状态值Vstate(n,m)向下纵移1行,并修正该初始的状态值Vstate(n,m)为n-1;
③若Gu(n)=Gd(n),则按照①和②的方式比较Gu(n-1)与Gd(n+1);
④迭代进行①-③,直至该行的梯度=1。
优选的,tANS转换表的行列互换,实现相同效果。
本发明的有益效果
本方案针对基于非对称数字***(ANS)处理压缩算法较新并且研究较少的目前现状,从如何快捷实现以及方便硬件化着手,设计了一种基于梯度下降的tANS编码/解码码表快速建立方案,可有效生成ANS编码解码的核心——tANS转换表。其算法的关键点是,首先,数据的存储形式简单方便,无需使用类似霍夫曼树二叉树链表式存储,可以大大减少了内存空间。其次,本方案设计的的tANS编码/解码转换表处理算法计算步骤简单,仅用比较,加及移位计算操作,不涉及其他复杂计算操作。最后,本方案中涉及到的所有的计算及存储方式不仅为软件计算提高效率,也是可以硬件化的,多种可实现形式使其应用更加灵活。如其若通过硬件的方式实现,即可成为针对网络数据存储推出的一个硬件加速技术,能够加速基于tANS编码/解码的数据的压缩,有效降低服务器CPU的负载。本方案方便的解决了tANS编码/解码转换表生成的问题,只使用有限的计算时间及较少了加法器和比较器使用个数,大大缩减了tANS编码/解码转换表生成所占用的硬件资源消耗。其可专注数据压缩加速,助力数据中心的性能提升。
附图说明
图1为本发明方法的流程图
具体实施方式
下面结合实施例对本发明作进一步说明,但本发明的保护范围不限于此:
本设计方案以文本数据块A的tANS编码/解码转换表生成举例说明。待编码的数据块如下所示。
表1:实施例文字段
如需对以上文字进行ANS编码压缩构建tANS编码/解码转换表,具体实施过程如下:
S1、对数据块中字符出现的频数进行统计并排序,即可得到表2:
表2待编码数据字符频数统计表
a |
b |
c |
d |
e |
f |
5 |
9 |
12 |
13 |
16 |
45 |
依据统计出的字符频数计算字符出现的概率即字符频率。
表2中每个字符出现的次数和所有字符出现的总次数100可以计算出每个字符出现的频率由表3所示:
表3待压缩编码数据字符频率统计表
a |
b |
c |
d |
e |
f |
0.05 |
0.09 |
0.12 |
0.13 |
0.16 |
0.45 |
S2、确定tANS转换表的形状。tANS编码/解码算法的核心就是这个转换表。创建这个表时,需要现根据字符频率大小排序确定转换表的表头,本实施例中,每个字符作为表的一列,从左往右频率依次递减(tANS转换表的行列互换,可以实现相同目的)。
表3中字符频率排序结果为:字符f,e,d,c,b,a的频率分别为0.45,0.16,0.13,0.12,0.05,其中每个字符都被分配为表的一列。
转换表中的实际内容为状态值,其状态值的取值范围为[2,Vmax],其中:
其中,Nsymbol为统计的字符的总数,这里为5;C的值可根据具体数据特点及压缩要求来选择,一般范围为2~8,这里取C为3。
接着根据每个字符出现频率乘以这个Vmax则得到每个字符需要的状态数Nstate,即在tANS编码/解码码表中该字符所在列含有元素的个数。
Nstate(a)=0.05×31≈1
Nstate(b)=0.09×31≈2
Nstate(c)=0.12×31≈3
Nstate(d)=0.13×31≈4
Nstate(e)=0.16×31≈4
Nstate(f)=0.45×31≈13
并计算得tANS编码/解码状态表的形状如表4所示
表4tANS编码/解码码形状
S3、初步为tANS转换表填入状态值。
计算方法如下,其中Vstate(n,m)为第n行m列的状态值,其等于行号除以该列字符的频率并向零取整。
……
则可得到初始的tANS内表格值如表5所示
表5tANS编码/解码码初值
S4、基于初始的tANS转换表,扩列建立状态数值展开表,即在初始tANS转换表的行表头中增加表头“状态数值”;
S5、基于状态数值展开表,计算状态数值频数,并在状态数值展开表的行表头中增加表头“状态数值频数”(实施例中简称“频数”);
经过步骤S4和S5后,建立状态数值展开表如表6所示,即可看出哪些状态数值没被用到,哪些状态数值被重复使用,并整理状态数频数在最后一列。
表6状态数值展开表
S6、对频数值大于1处计算上下的梯度,比较出梯度值大的方向,若上梯度大于下梯度,则将重复的两个状态值中位置在左边列的值上移变化,若下梯度大于上梯度,则将重复的两个状态值中位置在右边列的值下移变化。通过此操作迭代,则能解决频数列中值大于1的状态值分布,从而解决状态值重复的问题。
用F(x)函数表示状态数值映射的频数,Gu(n)函数表示状态数值的上梯度,Gd(n)函数表示状态数值的下梯度。
则有,
Gu(x)=F(x)-F(x-1)
Gd(x)=F(x)-F(x+1)
对于表状态数值6:
Gu(6)=F(6)-F(5)=2
Gd(6)=F(6)-F(7)=1
Gu(6)>Gd(6)
则为状态数值为6左边列(a列)元素上移为5,即由表6的内容调整为表7(局部)。
表7状态值6调整结果
对于表状态数值11:
Gu(11)=F(11)-F(10)=1
Gd(11)=F(11)-F(12)=1
Gu(11)=Gd(11)
接着上下方向继续判断梯度大小,
Gu(10)=F(10)-F(9)=1
Gd(12)=F(12)-F(13)=0
Gu(10)>Gd(12)
则为状态数值为10元素上移为9,11左边列(a列)元素上移为10,即由表6的内容调整为表8。
表8状态值11调整结果
对于表状态数值25:
Gu(25)=F(25)-F(24)=1
Gd(25)=F(25)-F(26)=1
Gu(25)=Gd(25)
接着上下方向继续判断梯度大小,
Gu(24)=F(24)-F(23)=0
Gd(26)=F(26)-F(27)=1
Gu(24)<Gd(26)
则为状态数值为26元素下移为27、25右边列(c列)元素下移为26,即由表6的内容调整为表9。
表9状态值25调整结果
S7、根据梯度迭代结果生成新的tANS编码/解码转换表,最终形式见表10。
表10最终tANS编码/解码转换表
本方案针对基于tANS编码/解码压缩算法较新并且研究较少的目前现状,从如何快捷实现着手,设计了一种基于梯度下降的tANS编码/解码转换表快速建立方案,可有效生成其算法核心tANS编码/解码转换表。本方案的关键点是,首先,方案整体步骤为保护点,快速有效的表生成并不存在元素冲突问题。其次,通过计算状态数值频数的上下梯度,比较上下梯度确定调整方向,精确调整状态数为保护点,可高效计算出状态总数。
本文中所描述的具体实施例仅仅是对本发明精神做举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。