【问题标题】:Packet oriented lossless compression library面向数据包的无损压缩库
【发布时间】:2011-08-22 10:01:11
【问题描述】:

有谁知道免费(非 GPL)、性能良好的压缩库,它支持 C/C++ 中面向数据包的压缩?

对于面向数据包,我的意思是QuickLZ (GPL) 具有的那种功能,其中可以单独压缩和解压缩流的多个数据包,同时跨数据包维护历史记录以实现合理压缩。

只要 CPU 使用率不高,我更倾向于压缩比而不是 CPU 使用率,但我很难找到这个功能,所以任何东西都很有趣。

【问题讨论】:

  • 面向数据包的压缩有什么好处?当您维护以前数据包的字典时,无论如何都需要解压缩所有以前的数据包。
  • 当然需要解压“所有以前的数据包”。但是许多应用程序在每个单独的数据包到达时对它们自己感兴趣。另一方面,压缩算法对作为流的数据感兴趣,以检测熵,因此希望随着时间的推移建立它的状态。目标应该很明显:允许发送方传输包含详细(即低熵)数据的数据包,并让压缩算法自动最小化实际发送的比特数。
  • 面向数据包的压缩的目的对我来说仍然不是很明显。如果需要,应该很容易将解压后的流分割成原始数据包。
  • 我认为 OP 希望保证他会及时获得小块解压数据,而不是在获得任何数据之前等待完全解压。
  • “免费(非 GPL)”是什么意思? BSD 许可证是否符合要求?

标签: c++ c compression


【解决方案1】:

zlib 的主要deflate() 函数采用flush 参数,它允许各种不同的刷新模式。如果您在每个数据包的末尾传递 Z_SYNC_FLUSH,那应该会产生预期的效果。

zLib manual中有详细说明。

bzip2 也有刷新功能,这可能会让你做这种事情。见http://www.bzip.org/1.0.5/bzip2-manual-1.0.5.html#bzCompress

【讨论】:

  • 是的。并且 zlib 许可证不是 copyleft。 GPL 更类似于 BSD 或 MIT。基本上,您不能 1) 在重新分发 source 时删除版权声明或 2) 修改它,仍然将其称为 ZLib。
  • 这实际上是一个相当不错的方法; Z_SYNC_FLUSH 保留压缩状态,简单地写入足够的数据,以便接收端可以读取到目前为止已经写入的内容。我想一年半后接受总比不接受要好:)
  • 我还想在这一点上补充一点,code.google.com/p/lzham(从 alpha8 开始)支持 zlib 样式的刷新,并且可以以相同的方式使用不同的性能特征。
【解决方案2】:

如果您需要速度而不是压缩并且只是希望节省适量的空间,那么 Google 的 Snappy 可能是一个不错的选择。

另外,Ilia Muraviev 不久前将一小段名为BALZ 的压缩代码放到了公共领域。对于多种数据来说,它是相当不错的。

这两者都支持流刷新和独立状态变量以跨数据包执行多个并发流。

【讨论】:

  • 是吗?我在 Snappy 中找不到 - 看起来它只是用无状态函数压缩。 BALZ 是命令行,而不是库,看起来它只是在块中流式传输标准输入,根本不支持数据包类型的东西?
【解决方案3】:

Google 的新 SPDY 协议使用 zlib 压缩单个消息,并在连接的生命周期内保持 zlib 状态以实现更好的压缩。我不认为有一个独立的库可以准确地处理这种行为,但是有几个 SPDY 的开源实现可以向您展示它是如何完成的。

【讨论】:

  • 很有趣,并且有很好的想法来为这个问题提出建议。您是否知道如何明智地发送小消息?
【解决方案4】:

Ilia Muraviev 的公共领域 Crush 算法具有与 QuickLZ 相似的性能和压缩比,Crush 更强大一些。这些算法在概念上也很相似,Crush 包含更多技巧。
前面已经提到的BALZ算法也是Ilia Muraviev的。
http://compressme.net/

【讨论】:

    【解决方案5】:

    也许你可以使用lzma compression SDK,它由 Igor Pavlov 编写并置于公共领域。

    而且由于它可以压缩流文件,并且具有内存到内存的压缩功能,我认为可以压缩数据包流(可能会进行一些更改),但不确定。

    【讨论】:

    • 有很多开源、免费使用的压缩库。压缩也是高度技术性的过程。简单地假设 lzma,它是专门为在大型数据集上获得最高性能而编写的,可以很容易地修改为处理小数据包(一个完全不同的问题)将需要的不仅仅是“可能”和“不确定”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多