我有一个系统,一台机器以包含整数和长整数的对象的形式生成小块数据。这些块被传递给另一个服务器,后者又将它们分发到其他地方。
我想压缩这些对象,以减少传递服务器上的内存负载。我知道像deflate这样的压缩算法需要构建一个字典,所以这样的东西对这么小的数据不起作用。
是否有任何算法可以有效地压缩此类数据?
如果没有,我可以做的另一件事就是将这些块批量处理为对象数组,并在数组达到一定大小后对其进行压缩。 但我不愿意这样做因为我必须更改现有系统中的接口。单独压缩它们不需要任何界面更改,这是所有设置的方式。
不是我认为这很重要,但目标系统是Java。
编辑:Elias gamma coding会对这种情况最好吗?
由于
答案 0 :(得分:3)
如果您认为将数据包减少到其熵级别是最好的,那么您可以尝试简单的霍夫曼压缩。
要及早了解这会压缩的程度,您可以通过Huff0传递数据包: http://fastcompression.blogspot.com/p/huff0-range0-entropy-coders.html
这是一个简单的0阶霍夫曼编码器。所以结果将具有代表性。
有关如何有效使用数据特征的更具体的想法,建议稍微描述数据包包含的数据及其生成方式(正如您在注释中所做的那样,因此它们是整数( 4个字节?)和长(8个字节?)),然后提供一个或几个样本。
答案 1 :(得分:2)
听起来您正在考虑通用压缩算法。压缩小块数据的最有效方法是构建一个知道数据结构的专用压缩器。
重要的是,您需要将您使用的编码与您希望从数据中分配的值进行匹配:要从Elias gamma编码中获得良好的结果,您需要确保您编码的值是小的正整数...
如果同一块中的不同整数不是完全独立的(例如,如果您的数组表示时间序列),您可以使用它来改善压缩(例如,时间序列中连续值之间的差异趋势小的签名整数)。但是,由于每个块都需要独立压缩,因此无法在连续块之间采用之间的差异。
如果您担心压缩器可能变成“扩展器”,则可以添加初始标志以指示数据是压缩还是未压缩。然后,在最糟糕的情况下,您的数据根本不适合您的压缩模型,您可以随时发送并发送未压缩的版本;你最糟糕的开销就是旗帜的大小......
答案 2 :(得分:1)
Elias Gamma Coding实际上可能会增加数据的大小。
你的数字已经有上限(无论是适合4或大概8字节的int / long)。此方法编码您的数字的长度,然后是您的数字(可能不是您想要的)。如果你得到很多小值,它可能会使事情变小。如果你也得到大值,它可能会增加大小(8字节无符号最大值几乎会变大两倍)。
查看数据包的entropy。如果它接近最大值,压缩将毫无用处。否则,请尝试使用不同的GP压缩机。我不确定压缩和解压缩所花费的时间是否值得减小尺寸。
答案 3 :(得分:1)
我会仔细查看压缩库的选项,例如deflateSetDictionary()和http://www.zlib.net/manual.html中的标志Z_FILTERED。如果您可以在源代码中分发 - 或者硬连线 - 提前向发送方和接收方提供一致的字典,并且如果该字典代表真实数据,那么您应该获得适当的压缩节省。糟糕 - 在Java中查看java.util.zip.Deflater.setDictionary()和FILTERED。