【问题标题】:Good compression algorithm for small chunks of data? (around 2k in size)小块数据的良好压缩算法? (大约 2k 大小)
【发布时间】:2011-09-29 16:50:01
【问题描述】:

我有一个系统,其中一台机器以包含整数和长整数数组的对象形式生成小块数据。这些块被传递到另一台服务器,该服务器又将它们分发到其他地方。

我想压缩这些对象以减少直通服务器上的内存负载。我知道像 deflate 这样的压缩算法需要构建一个字典,所以这样的东西不会真正适用于这么小的数据。

是否有任何算法可以有效地压缩这样的数据?

如果没有,我可以做的另一件事是将这些块批处理成对象数组,并在数组达到一定大小时对其进行压缩。 但我不愿意这样做,因为我必须更改现有系统中的接口。单独压缩它们不需要任何界面更改,这都是设置的方式。

我认为这并不重要,但目标系统是 Java。

编辑:Elias gamma coding 是否最适合这种情况?

谢谢

【问题讨论】:

  • 整数和长整数数组——是否有可能的值,或者它们通常被限制在一个较小的范围内?数组中是否有重复/模式?
  • @foson 这些值可以是任何值。我确定它们属于常规分布,但我没有这些信息。它们是时间戳和指标。我敢肯定多头可能会很大(例如 unix 时间)
  • 您确定 deflate 不会对您的数据起作用吗?你测试过吗?
  • 大多数通用压缩算法的工作原理是在源数据中查找模式,然后对这些模式使用替代(较小的)编码。击败通用压缩器的唯一方法是识别 GP 压缩器无法识别的模式,或者重新排列数据以便 GP 压缩器可以识别模式。跨度>
  • @ Jim Mischel - 这就是我寻找非 GP 的原因。 Elias 伽马编码可能会解决问题。

标签: algorithm compression


【解决方案1】:

如果您认为将数据包减少到它的熵级别是最好的,您可以尝试一个简单的霍夫曼压缩。

为了尽早了解这将如何压缩,您可以通过 Huff0 传递一个数据包: http://fastcompression.blogspot.com/p/huff0-range0-entropy-coders.html

它是一个简单的 0 阶霍夫曼编码器。所以结果会有代表性。

有关如何有效使用数据特征的更具体的想法,建议稍微描述一下数据包包含哪些数据以及它是如何生成的(就像您在 cmets 中所做的那样,因此它们是整数 ( 4 个字节?)和 longs(8 个字节?)),然后提供一个或几个样本。

【讨论】:

    【解决方案2】:

    听起来您目前正在研究通用压缩算法。压缩小块数据的最有效方法是构建一个了解数据结构的专用压缩器。

    重要的是,您需要将您使用的编码与您期望从数据中得到的值的分布相匹配:要从 Elias gamma 编码中获得良好的结果,您需要确保您编码的值是较小的正整数...

    如果同一块中的不同整数不是完全独立的(例如,如果您的数组表示时间序列),您可以使用它来改进压缩(例如,时间序列中连续值之间的差异倾向于是小的有符号整数)。但是,由于每个块都需要独立压缩,因此您将无法利用这种 连续块之间的差异。


    如果您担心压缩器可能会变成“扩展器”,您可以添加一个初始标志来指示数据是压缩的还是未压缩的。然后,在您的数据根本不适合您的压缩模型的最坏情况下,您可以随时取消并发送未压缩的版本;你最坏情况的开销是标志的大小......

    【讨论】:

      【解决方案3】:

      Elias Gamma 编码实际上可能会增加数据的大小。

      您的数字已经有了上限(任何适合 4 字节或可能 8 字节 int/long 的数字)。此方法编码您的号码的长度,然后是您的号码(可能不是您想要的)。如果你得到许多小值,它可能会使事情变小。如果您还获得大值,它可能会增加大小(8 字节无符号最大值几乎会变成两倍大)。

      查看您的数据包的entropy。如果接近最大值,压缩将无用。否则,请尝试不同的 GP 压缩器。虽然我不确定压缩和解压缩所花费的时间是否值得减小尺寸。

      【讨论】:

        【解决方案4】:

        我会仔细查看您的压缩库的选项,例如 deflateSetDictionary() 和 http://www.zlib.net/manual.html 中的标志 Z_FILTERED。如果您可以提前向发送者和接收者分发(或在源代码中硬连线)一个商定的字典,并且如果该字典代表真实数据,那么您应该获得可观的压缩节省。糟糕 - 在 Java 中查看 java.util.zip.Deflater.setDictionary() 和 FILTERED。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多