我已经阅读了有关SPDP的研究:浮点数据https://userweb.cs.txstate.edu/~mb92/papers/dcc18.pdf的自动综合无损压缩算法
现在,我想实现一个程序来模拟浮点数据的压缩。 我不知道从哪里开始。我有一个文本文件,里面有一组实数。 我知道我必须使用混合技术。 最好使用c还是java?
我曾考虑过在当前值和先前值之间进行XOR。然后,我计算这些差异的频率,最后应用霍夫曼算法。 可以吗?
有什么建议吗?
答案 0 :(得分:1)
根据该论文,他们的代码是使用gcc/g++ 5.3.1 using the “-O3 -march=native” flags
进行编译的,因此您可以使用类似的代码。另外,这听起来像是一种短期工具,可能比C
更好,而不是Java
。
在编写算法时,您可能希望使用他们确定的最佳算法。在这种情况下,您需要慢慢仔细地阅读 我在下面复制的内容。如果您不了解任何内容,则必须进一步研究。
仔细阅读每个子算法(算法组件)的描述并编写其正向实现和反向实现-您需要编写反向实现,以便以后可以解压缩数据。< / p>
一旦所有子算法都已完成并经过测试,就可以按照描述的方式将它们组合到综合算法中。并为综合算法编写逆转。
算法组件将在下面进一步介绍。
SPDP,这是CRUSHER的数据集中压缩效果最好的四成分算法 9,400,320个条目的搜索空间为 LNVs2 | DIM8 LNVs1 LZa6 。尽管最后必须有一个reducer组件,但在前三个位置都没有出现,即CRUSHER生成了一个三级数据模型,然后是一个一级编码器。该结果表明,将每个压缩算法链接在一起(每个压缩算法都包含一个reducer)是不利的。另外,Cut出现在第一个组件之后,因此重要的是首先按字粒度然后按字节粒度处理数据,以最大化压缩率。
开始时以4字节粒度运行的 LNVs2 组件特别受关注。它从序列中的当前值中减去第二个先前的值,并发出残差。这使算法能够很好地处理单精度和双精度数据。如果是8字节的双精度数,它将取前一个双精度数的上半部分,然后从当前双精度数的上半部分减去它。然后,对下半部分执行相同操作。除了抑制进位以外,结果与对8字节值计算差分序列相同。对于4字节单精度数据,即使使用倒数第二个而不是最后一个值,此组件也将计算差异序列。如果值相似(差序列有帮助),则第二个先前的值也相似,并且应该产生残差,其残差也将聚集在零附近。这一观察回答了我们的第一个研究问题。 我们能够从综合算法中学习,在这种情况下,如何处理混合的单精度/双精度数据集。
剪切之后的 DIM8 组件将组成单个或双精度值的字节分开,以便将最高有效字节分组在一起,然后是第二最高有效字节之所以可能这样做,是因为在IEEE 754浮点值中保存指数和顶部尾数位的最高有效字节彼此之间的关联比与相同值中其余字节的关联更大。紧随其后的 LNVs1 组件支持此假设,该组件计算字节粒度差异序列,因此可以精确地利用连续值相同位置中字节之间的这种相似性。 LZa6 组件压缩所得的差异序列。它使用 n = 6来避免不良匹配,从而导致发出零计数,从而扩大而不是压缩数据。选择的 n 较高的值表明,经常出现不良匹配,这是相对随机的数据集所期望的(参见表1)。
DIM n 组件采用参数n来指定维数并相应地对值进行分组。例如,尺寸为3的线性序列 x1,y1,z1,x2,y2,z2,x3,y3,z3 变为 x1,x2,x3,y1,y2,y3 ,z1,z2,z3 。我们使用 n = 2、4、8和12。
LNV kn 组件具有两个参数。它从当前值中减去最后一个 n 个值,并发出残差。如果k = s,则使用算术减法。如果k =“ x”,则使用按位减法(xor)。在这两种情况下,我们都测试了n = 1、2、3、4、8、12、16、32和64。以上所有组件均未更改数据块的大小。接下来的三个组件是唯一可以减少数据块长度(即压缩它)的组件。
LZ ln 组件实现了 LZ77 算法的一种变体(Ziv,J。和A. Lempel。数据压缩。” IEEE事务 信息理论研究,第一卷23,第3号,第337-343页。 1977)。它结合了权衡因素,使其在难以压缩的数据上比其他LZ77版本更有效,并且操作如下。它使用32768项哈希表来标识 l 当前值的最近的先前出现。然后,它检查紧接在这些位置之前的 n 值是否与当前位置之前的 n 值匹配。如果不是,则仅发出当前值,并且组件前进到下一个值。如果 n 值匹配,则组件将计算当前值后的多少个值与该位置后的值匹配。发出匹配子字符串的长度,并且组件前进那么多值。我们认为 n = 3、4、5、6和7与 l ='a','b'和'c'组合,其中'a'= 1,'b'= 2和'c'= 4,这会产生15个LZ ln 分量。
│伪组件(称为 Cut ),由竖线表示,是将单词序列转换为字节序列的单例组件。 CRUSHER产生的每一种算法都包含一个Cut,因为它可以对字节进行压缩,而不是对字的粒度进行压缩,所以更有效。
请记住,如果要解压缩数据,还需要包括这些算法的逆转。
我希望这个澄清对您有所帮助,并祝您好运!
答案 1 :(得分:0)
Burtscher有几篇有关浮点压缩的文章。在进入SPDP之前,您可能需要尝试本文https://userweb.cs.txstate.edu/~burtscher/papers/tr08.pdf。本文在第7页上列出了代码。您可以将其复制并粘贴到C文件中,然后再尝试使用更严格的算法。
第二,不要期望这些FP压缩算法会压缩所有浮点数据。为了获得良好的压缩率,预计相邻的FP值在数值上彼此接近或表现出某些重复的模式。 Burtscher使用一种称为有限上下文建模(FCM)和差分FCM的方法:“我之前已经看过这种模式;让我预测下一个值,然后对实际值和预测值进行XOR运算以实现压缩...”