【问题标题】:In what situation would compressed data be larger than input?在什么情况下压缩数据会大于输入?
【发布时间】:2013-06-08 10:23:22
【问题描述】:

我需要在我正在开发的实用程序中处理主要是 UTF-8 HTML 内容的数据压缩。该实用程序使用 zLib 和 deflate 算法来压缩数据。假设如果输入数据大小超过 1 kB,压缩数据将始终小于未压缩输入是否安全? (小于 1 kB 的输入数据不会被压缩。)

我试图看看这种假设会被打破的情况,但除了近乎完美的随机输入之外,这对我来说似乎是一个安全的假设。

编辑:我想知道这个假设的原因是因为我已经分配了一个与输入数据一样大的缓冲区。如果我的假设成立,我可以重用同一个缓冲区并避免再次分配内存。

【问题讨论】:

  • 为什么要做出这样的假设?只需分配足够大的缓冲区并确保安全。
  • @CarlNorum 当然,我可以,但这并不能回答我的问题。 :)

标签: c compression zlib


【解决方案1】:

没有。您永远不能假设压缩数据总是更小。事实上,如果任何序列被算法压缩,那么你肯定会扩展一些其他序列。

您可以使用 zlib 的 deflate() 函数将尽可能多的内容压缩到 1K 缓冲区中。对该结果执行任何您需要的操作,然后继续将另一个 deflate() 调用写入同一缓冲区。

或者,您可以分配一个足够大的缓冲区以进行最大扩展。 deflateBound()compressBound() 函数会告诉你那是多少。只是多了一点点。

【讨论】:

  • 感谢您的回答。是否有一个好的经验法则来一次压缩所有输入数据需要多少内存?我当前的缓冲区与输入数据一样大,如果我不得不过度分配,我想提前做。如果可能的话,我想避免调用deflateBound() - 我试图尽可能多地缩短执行时间。我假设您对什么是安全缓冲区有很好的了解。 :)
  • 只需致电deflateBound()。生活的目的就是成为那个经验法则。它非常简单,因此您将无法测量其执行时间。
【解决方案2】:

据我所知,zLib 不会压缩 0、1、2、...、127 的 128 字节序列。从技术上讲,可以故意创建一个会破坏您的压缩方案的 HTML 页面,但是对于普通的无辜 HTML 数据,您应该几乎是完全安全的。

但几乎完美并不完美。如果您已经有该大小的缓冲区,我建议您尝试使用此缓冲区进行压缩,如果结果证明缓冲区不够(我想 zLib 有指示的方法),那么分配一个更大的缓冲区或只需存储一个未压缩的版本。并确保将这些案例写入一些日志,以便查看它是否会触发:)

【讨论】:

  • 谢谢 - 我想尝试一下是个好主意。 1 kB 下限背后的共鸣是为了允许数据中有足够的冗余,从而使大小假设成立。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 2020-11-14
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
相关资源
最近更新 更多