Algorithm 我需要选择一种压缩算法

Algorithm 我需要选择一种压缩算法,algorithm,language-agnostic,compression,Algorithm,Language Agnostic,Compression,我需要选择一种压缩算法来压缩一些数据。我不知道我将要提前压缩的数据类型(把它想象成有点像WinRAR程序) 我听说过以下算法,但我不知道应该使用哪一种。任何人都可以发布一个简短的利弊清单吗?对于我的应用程序,首要的是解压速度;第二个优先事项是节省空间。压缩(而非解压缩)速度与此无关 泄气 内爆 普通哈夫曼 bzip2 lzma 如果需要高解压速度,则应使用LZO。它的压缩速度和比率都不错,但很难超过它的解压速度。要获得关于文本数据的全面基准,您可能需要查看 对于其他类型,.在Linux内核中有

我需要选择一种压缩算法来压缩一些数据。我不知道我将要提前压缩的数据类型(把它想象成有点像WinRAR程序)

我听说过以下算法,但我不知道应该使用哪一种。任何人都可以发布一个简短的利弊清单吗?对于我的应用程序,首要的是解压速度;第二个优先事项是节省空间。压缩(而非解压缩)速度与此无关

  • 泄气
  • 内爆
  • 普通哈夫曼
  • bzip2
  • lzma

如果需要高解压速度,则应使用LZO。它的压缩速度和比率都不错,但很难超过它的解压速度。

要获得关于文本数据的全面基准,您可能需要查看


对于其他类型,.

在Linux内核中有很好的解释(从包含的类型中):

  • 放气(gzip)-快速、最差压缩
  • bzip2-慢速、中等压缩
  • lzma-非常慢的压缩,快速的解压缩(但是比gzip慢),最好的压缩
我没有使用其他的,所以很难说,但算法的速度可能很大程度上取决于架构。例如,有研究表明,HDD上的数据压缩可以加快I/O速度,因为处理器的速度比磁盘快得多,所以值得。然而,这在很大程度上取决于瓶颈的大小

类似地,一种算法可能会大量使用内存,这可能会也可能不会导致问题(12 MiB——它是很多还是很小?在嵌入式系统上,它是很多;在现代x86上,它是内存的一小部分)。

看一看。它是开源的,包含7种独立的压缩方法。我们所做的一些小测试表明,7z格式的结果文件比zip小得多,而且对于我们使用的示例数据来说,速度也更快


因为我们的标准压缩是zip压缩,所以我们还没有研究其他压缩方法。

我运行了一些基准测试来压缩包含高熵数据和文本的.tar。结果如下:

Name - Compression rate* - Decompression Time 7zip - 87.8% - 0.703s bzip2 - 80.3% - 1.661s gzip - 72.9% - 0.347s lzo - 70.0% - 0.111s *Higher is better 名称-压缩率*-解压缩时间 7zip-87.8%-0.703s bzip2-80.3%-1.661s gzip-72.9%-0.347s lzo-70.0%-0.111s *越高越好 由此我得出结论,一个算法的压缩率取决于它的名称;按字母顺序排列的第一个将是具有最佳压缩率的,依此类推

因此,我决定将
lzo
重命名为
1lzo
。现在我有了最好的算法



编辑:值得注意的是,不幸的是,在所有这些语言中,
lzo
是唯一拥有非常严格的许可证(GPL)的语言:(

有些语言内置了对某些语言(可能全部)的支持)如果你不知道你要压缩的数据类型,我想这很难,但是希望你有一些想法,或者有一些随机生成数据的方法,在某种程度上接近你要使用的数据。这是“一些数据”?有什么提示吗?还有其他类型的数据呢?不过,我应该补充一下它通常取决于数据。(这就是为什么它只是指示性的。)请注意,deflate是一种数据格式,而gzip是一种使用deflate压缩文件的文件格式。Linux内核中的选项称为gzip(如何压缩内核/initrd)。所以我也包括了它。哇,谢谢!以前从未听说过,但它似乎正是我想要的。+1是一个惊人的发现!这似乎对视频压缩也适用,但方向相反:x264>XviD>DivX;)(区分大小写的排序;)“非常严格的许可证(GPL)”--/me恢复了由来已久的BSD vs GPL参数:对开发人员有限制,但对最终用户没有限制!:)