假设您有很多文件需要存档。它们有几种不同的文件格式(txt、docx、pdf、png、jpg、mp3、zip 等)。
压缩它们全部的最佳做法是什么,以便它们占用尽可能少的空间?
例如,根据那个问题,用同一种压缩算法去压缩一个或几个已经压缩的文件基本上是没用的,但是通过使用不同的算法可以取得更好的压缩率。
另一个例子:将具有相同文件格式的文件一起压缩是否最好?
我对哪种压缩格式最好并不感兴趣,但了解其中一些在某些情况下表现更好会很有趣。
答案1
首先,除了文本和 PDF 文件之外,您列出的所有内容都已压缩。DOCX 文件是 gzip(实际上是 DEFLATE,但它们使用与 gzip 兼容的标头)压缩的 XML,PNG 使用 DEFLATE,JPG 和 MP3 有自己的方法(每种方法使用的算法组合特定于其格式),ZIP 文件使用 DEFLATE,或有时使用 BZip2。其中,只有 JPEG 和 MPEG 可能获得明显更好的压缩比,但前提是它们一开始就被最低限度压缩,即使这样,收益也可能微乎其微。PDF 文件的压缩效果可能也不是很好,因为它们可能主要是图像而不是文本,文本也可能已经被压缩(通常使用 JPEG 压缩)。
现在,我们已经解决了这个问题,让我们来回答你的主要问题:
对相似的文件类型进行分组有帮助吗?
有时是,有时不是。如果文件都小于压缩算法的块大小,它可能会有所帮助,可能非常有帮助。但如果它们都更大,通常不会有太大帮助。对于文本文件(纯文本或像 PDF 一样封装它的文件),如果文件小于压缩块大小,将相同语言的文件分组会很有帮助,因为数据中通常会有大量冗余。
不幸的是,这是否有可能对您的情况有所帮助,您必须进行测试。
在某些情况下某些算法是否比其他算法更好?
绝对如此。JPEG 和 MPEG layer 3 就是例子。两者都针对压缩特定类型的数据(图像或音频)进行了优化。 布罗特利是另一个在某些情况下表现更好的很好的例子,它针对文本数据流进行了优化。不过,您可能使用的大多数压缩格式都是通用的,这通常意味着它们在压缩文本数据等内容方面做得很好,而在压缩未结构化为字节流的数据方面做得相当差(DEFLATE 是一种通用算法,当您将 PNG 图像的大小与其他相同的 JPEG 图像进行比较时,这一事实确实显而易见)。
鉴于您拥有大量混合数据,您可能不必过于担心这一点。
存档大量数据以使其占用最少空间的最有效方法是什么?
可能是一些变体帕金森病问卷。PAQ 算法通常被认为是最好的(就压缩率而言)通用压缩算法,并且广泛可用。它们还采用永远压缩任何合理大小的数据量,因此它们可能不适用于您的特定情况。就它们需要多长时间而言,更现实的选择包括:
- 西泽:它使用 LZMA 压缩并进行了一些额外的预处理,使其能够以高于平均水平的速度压缩机器代码。除 Windows 之外,它广泛适用于所有平台(尽管您可以在 Windows 上使用它),并且通常可以获得非常好的压缩率(LZMA 是目前性能合理、压缩率高的压缩算法的黄金标准之一)。
- 規模:这是 Facebook 的优秀软件工程师开发的新版本。在大多数情况下,它的运行速度比 XZ 快,压缩率相当(通常略好于我的经验)。目前尚未广泛使用,但如果您可以在系统上安装它,则值得一试。
无论如何,如果您希望在一个地方轻松处理所有文件,则需要一种存档格式来将文件分组在一起。 Tar 是我通常使用的格式,但我主要处理 Linux。 未压缩的 ZIP 文件(您可以在 Windows 上使用命令行执行此操作)也可以使用。
如果您有大量文件,我建议将它们分组到多个较小的存档中,而不是一个大存档中。这会稍微损害您的压缩率,但会在您以后需要从存档中提取内容时为您节省大量时间,并使处理损坏存档的恢复变得更加容易。
如果您要正确设置存档的恢复数据,请根据最终要存储在磁盘上的格式(即最终的压缩存档文件或文件)进行设置。压缩数据流中的一个位变化可以完全改变解压该数据流的结果,因此在解压之前纠正错误比之后纠正错误要容易一些(因为解压会放大错误的大小)。