我需要压缩一些空间相关的数据记录.目前我使用zlib获得1.2x-1.5x压缩,但我认为它应该可以更像2x.数据记录有各种字段,但是例如,zlib似乎无法压缩点列表.
这些点代表道路网络.它们是XXXXYYYY形式的定点4字节整数对.通常,如果单个数据块具有100个点,则将仅存在X和Y的前两个字节的几个组合(空间相关性).但是底部字节总是在变化,并且必须看起来像随机数据到zlib.
类似地,记录具有4字节ID,其倾向于具有恒定的高字节和可变的低字节.
还有其他算法可以更好地压缩这类数据吗?我正在使用C++.
编辑:请不要再建议更改数据本身.我的问题是关于自动压缩算法.如果有人链接到所有流行压缩算法的概述,我会接受这个作为答案.
如果您尝试根据自己的结构知识自行压缩数据,则可能会获得更好的结果.
通用压缩算法只是将您的数据视为比特流.它们寻找常用的位序列,并用较短的字典索引替换它们.
但重复的数据并没有消失.重复的序列变得更短,但它仍然像以前一样经常重复.
据我了解,您有大量的表单数据点
XXxxYYyy,大写字母非常均匀.因此将它们排除在外.
将列表重写为类似于此的内容:
XXYY // a header describing the common first and third byte for all the subsequent entries
xxyy // the remaining bytes, which vary
xxyy
xxyy
xxyy
...
XXYY // next unique combination of 1st and 3rd byte)
xxyy
xxyy
...
Run Code Online (Sandbox Code Playgroud)
现在,很少变化的字节的每个组合仅列出一次,而不是针对它们出现的每个条目重复.这相当于节省了大量空间.
基本上,在通过zlib运行之前,尝试自己删除重复数据.您可以更好地完成它,因为您有关于数据的其他知识.
另一种方法可能是,不是将这些坐标存储为绝对数字,而是将它们写为增量,与选择的所有位置的相对偏差尽可能接近所有条目.您的增量将是较小的数字,可以使用较少的位存储.