我有几个文件夹,每个文件夹大约 8GB。这些文件夹总共有 60GB 左右的数据。我可以用两种方法压缩这些文件夹:要么单独压缩,为每个文件夹创建一个压缩档案,要么将它们全部压缩成一个大型压缩档案。
一般来说,假设所有要压缩的数据都是同一类型,并且使用的压缩算法是相同的(并且我也不关心解压缩较大文件所需的时间),那么这两种方法是否会比另一种方法产生更好的压缩效果,或者两种情况下压缩文件的总大小是否会趋于相等?
答案1
压缩为一个大型档案是否比单独压缩文件夹产生更好的压缩效果?不必要。
仅当档案库使用固体压缩。非压缩档案(如 Zip 档案)会单独压缩文件。这使您能够轻松地从档案中解压缩单个文件。它还允许您将文件添加到档案中,而无需重新压缩所有内容。
对于固定档案,这一切都要困难得多:为了在流的最后解压文件,必须解压所有内容(尽管不一定写入磁盘)。添加文件时,算法也需要检查所有内容。
不过,还有一个折衷方案:使用“实体块”。现在存档器不必一直处理整个文件,而只需处理文件的一部分。
在 7-Zip GUI 中,它是这个选项:
如果不考虑被压缩的数据,这非常简单:
- 非固态:快速交互式访问,压缩性最差
- 实心块:交互访问效率较高,压缩效果更好
- 可靠:无交互式访问,最佳压缩
根据预测的访问模式,您应该选择合适的变体。
答案2
虽然无法绝对肯定地说,但理论上,一个较大的档案应该会导致一个较小的档案大小,因为可以发现更多的重复数据块。这是假设数据像您所说的那样同质化。
但是,某些文件夹完全有可能包含具有更多相似数据块的文件,因此,作为其自己的单独存档可能会压缩得更好。
要知道哪种方法最好,唯一真正的方法就是两种方法都进行测试。
答案3
单个档案几乎总是会较小,尽管原因并非您所想的那样。
简而言之,通过只创建一个存档,您就不会因为多个存档文件头而浪费空间。存档文件占用的最小空间量仅为有效存档,并且您创建的每个存档最终都会占用那么多空间。唯一广泛使用的例外是格式cpio
,它没有存档本身的头,而是只有每个文件的头。
更现实的是,你会通常仅使用一个存档而不是多个存档即可获得至少同样好的压缩率,并且使用某些存档器可以得到更好的压缩率(例如,zpaq
重复数据删除之内存档,因此如果有大量重复数据,它可以节省大量空间)。
不过,在做出决定之前,你还需要问另一个问题:处理单个大型档案而不是多个小型档案的开销是否值得节省空间?根据你存储数据的位置,使用较小的档案可能更经济,特别是如果你可能一次只需要其中一个文件夹。
但总体而言,Keltari 是正确的,唯一能确定的方法就是进行测试。