压缩所有数据还是压缩目录更好?

压缩所有数据还是压缩目录更好?

我正在存档一些项目,假设每个项目都有自己的目录:

projects
 |- project-1
 |- project-2
 |- project-3

我开始按如下方式压缩它们:

==== SITUATION 1 ====

projects
 |- project-1.zip
 |- project-2.zip
 |- project-3.zip

然后我开始想知道将所有数据压缩到一个 zip 文件中是否更好:

==== SITUATION 2 ====

projects.zip
 |- project-1
 |- project-2
 |- project-3

或者可能压缩已经压缩的文件?:

==== SITUATION 3 ====

projects.zip
 |- project-1.zip
 |- project-2.zip
 |- project-3.zip

哪种情况最好(占用空间最少)?为什么?这取决于压缩算法吗?我知道压缩压缩文件没什么用,但如果有 20 个呢?对我来说,情况 1 看起来不是一个好主意。

答案1

说实话,我怀疑不同的方案是否会产生很大的差异,因为压缩算法通常只期待有限的量来控制内存的使用。

例外是 S3,它最终可能会变得更大,因为压缩压缩文件会增加开销但无法压缩。

如果您想要更好的压缩,请寻找具有更好算法的较新的归档工具。例如,7-zip 通常比 zip 更好。

关于 s1 和 s2 之间的区别,我想说这取决于您将来最有可能如何使用档案以及它们最终有多大。

处理真正大的档案(移动、打开等)非常麻烦,这可能比节省几kB更重要。

此外,在考虑长期存储时,不要忽视“位腐烂”。大型档案中的小错误可能会造成毁灭性的影响。丢失一个项目可能比丢失所有项目要好得多。

但是,您可能会考虑使用 RAR 之类的东西,它允许冗余和拆分存档。这有点像 RAID5。您可以创建多个存档文件,每个文件都具有内置冗余,这样您就可以丢失文件并重新创建原始数据。

答案2

首先,请记住@Julian Knight 的出色论点。如果您的档案太大而无法处理,或者被一些翻转位损坏,那么即使是最好的压缩也是无用的。

如果空间是您主要关心的问题,那么针对您的特定数据和不同的压缩算法进行一些实验可能是值得的。

此外,你的第三种方法确实可以导致尺寸再次减小。我记得一些讨论(看这里) 介绍了使用不同算法多次压缩文件。作者正在压缩高度冗余的文本文件,经过足够的实验后,文件大小可以从 100GB 压缩到几 MB。请注意,他的情况有点特殊,但总体思路是,在某些情况下,迭代压缩实际上是值得的。

如果您愿意尝试不同的压缩算法,这里有一些比较速度和压缩率的基准:

答案3

情况 3 不适用,因为使用相同算法重新压缩档案是没有意义的。

在情况 1 和情况 2 之间,后者肯定更有可能产生较小的存档,尤其是当您使用较大的字典大小时(简单来说,字典是用于查找和压缩数据中重复模式的内存区域)。普通的旧 ZIP 只能使用一个很小的 ​​32KB 字典,考虑到当今的硬件,这个字典太小了。

相比之下,RAR 5.0 格式在 64 位系统上可以使用 1GB 字典。它还支持将相同的文件保存为参考

如果启用此选项,WinRAR 会在开始压缩之前分析文件内容。如果发现多个大于 64 KB 的相同文件,则将集合中的第一个文件保存为普通文件,并将所有后续文件保存为对第一个文件的引用。它允许减小压缩文件大小,但对生成的压缩文件有一些限制。在创建压缩文件后,您不得删除或重命名压缩文件中的第一个相同文件,因为这将导致无法将其作为引用提取后续文件。如果您修改第一个文件,则提取后后续文件也将具有修改后的内容。提取命令必须涉及第一个文件才能成功创建后续文件。

因此,如果你的项目中有许多重复文件,那么较大的字典大小与可靠的归档以及上述功能相结合很可能会导致文件大小显著减少,情况 2。当然,所有关于大型档案的一般警告都适用,因此包括一个恢复记录也会被推荐。

答案4

正如其他人所说,情况 3 是最糟糕的。前两个选项大致相同,但情况 2 略好一些,因为一些元数据(可能还有字典)重用

然而,对于存档目的而言,以上所有方法都不太好,因为 zip 格式不支持固体档案. 7z 和 rar 默认使用固实档案(7z 压缩包是单独压缩每个文件还是将所有文件合并为一个进行压缩?),因此压缩率要好得多(因为您肯定会在许多文件中重复相同的字节模式)。这与您tar(即制作一个坚固的未压缩档案)然后传递给 gz 或 bz2 进行压缩的方式相同。另一方面,zip 分别压缩每个文件,因此提取单独的文件会更容易,但压缩输出会大得多

因此,你应该使用情况 2,但改为 7z 或 rar

相关内容