我需要选择一种压缩算法来压缩一些数据。我不知道我将提前压缩的数据类型(将其想象为有点像 WinRAR 程序)。
我听说过以下算法,但我不知道应该使用哪一种。谁能发布一个简短的优点和缺点列表?对于我的应用来说,首要考虑的是解压速度;第二要务是节省空间。压缩(不是解压)速度无关紧要。
我运行了一些压缩 .tar 的基准测试,其中包含高熵数据和文本的组合。这些是结果:
名称 - 压缩率* - 减压时间 7zip - 87.8% - 0.703 秒 bzip2 - 80.3% - 1.661s gzip - 72.9% - 0.347s lzo - 70.0% - 0.111s *越高越好
由此我得出的结论是,算法的压缩率取决于它的名称;按字母顺序排列的第一个将是具有最佳压缩率的那个,依此类推。
因此我决定将
lzo
重命名为1lzo
。现在我拥有有史以来最好的算法。
编辑:值得注意的是,不幸的是,
lzo
是唯一一个拥有非常严格的许可证(GPL)的:(
如果您需要高解压速度,那么您应该使用LZO。它的压缩速度和比率都不错,但它的解压速度很难被超越。
在 Linux 内核中对此有很好的解释(来自包含的内容):
我没有使用过其他的,所以很难说,但算法的速度可能很大程度上取决于架构。例如,有研究表明 HDD 上的数据压缩可以加速 I/O,因为处理器比磁盘快得多,所以这是值得的。然而,这很大程度上取决于瓶颈的大小。
类似地,一种算法可能会大量使用内存,这可能会也可能不会导致问题(12 MiB - 它是很多还是很小?在嵌入式系统上它很多;在现代 x86 上它只是内存的一小部分)。
看看7zip。它是开源的,包含 7 种独立的压缩方法。我们所做的一些小测试表明,7z 格式提供的结果文件比 zip 小得多,而且对于我们使用的示例数据来说,它的速度也更快。
由于我们的标准压缩是zip,所以我们还没有考虑其他压缩方法。
当今最快的压缩算法之一是LZ4,据报道在解压过程中达到了RAM速度限制。
另一方面,通常提供最佳压缩比率的算法是LZMA2,由xz和7z使用。但是,有两个注意事项:
xz
中发现了后门 - https://arstechnica.com/security/2024/04/what-we-know-about-the-xz-utils-backdoor-that-almost-infected -世界/Zstandard提供了良好的平衡,速度很快,但也可以提供与LZMA竞争的比率。
当今另一个流行的选择是Brotli,它更注重速度而不是实现最高压缩比。最近,HTTP
协议中添加了对 Zstd 和 Brotli
Content-Encoding
的支持。
基准测试中的获胜者曾经是