我应该使用 .tar.gz 吗?
Posted
技术标签:
【中文标题】我应该使用 .tar.gz 吗?【英文标题】:Should I use .tar.gz? 【发布时间】:2015-01-29 05:41:52 【问题描述】:在 Unix 世界中,有一种著名的格式叫做“tar.gz”。
但是现在,我想开发一个游戏,随机访问一个文件会更有效率。如果先归档,会导致顺序访问。
我知道有一种替代格式叫做 zip 或 7z,但是其他格式呢?
不仅是 gz.tar,我还想要一个小型压缩库并获得归档功能。
我应该使用 *.tar 还是其他可用的解决方案?
PS:我使用的是 C++。
【问题讨论】:
你的意思是.tar.gz
吗?
【参考方案1】:
“随机”访问在 .tar.gz 上并不好,因为这是一个已被 .gz 压缩的 .tar 文件,因此要访问 .tar 文件中的内容,您首先需要解压缩 .tar 文件。
可以使用包含使用 .gz 压缩的单个文件的 .tar 文件。您可以阅读 .tar 文件的目录并查找/存储所有文件在存档中的位置,然后根据需要进行提取。但是,您可能会发现使用自己的格式“更好”(例如,如果我没记错的话,tar-archive 的“标题”是一次一个文件,您可能希望一次性构建标题,在存储文件之前[这确实意味着至少首先枚举所有相关文件,然后形成压缩变体并用压缩形式的偏移量“修补”标题]
对于一款游戏,解压速度可能是一个关键因素,因此您可能需要查看不同的库以及哪个库具有最佳解压速度。我在搜索比较时发现了这一点: http://catchchallenger.first-world.info//wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO
您可能还关心内存使用情况,这也因算法而异。
而且我猜你的单个文件会比 Linux 的整个 tar-ball 小得多,所以你可能想用你自己的数据做你自己的基准测试——毕竟,不同压缩格式的速度确实如此,在某种程度上,取决于数据的格式。
【讨论】:
【参考方案2】:通常,对于电脑游戏,您需要一种格式,其中每个文件在被组合成一个文件之前单独压缩。这是 .tar.gz 和 .zip / .7z 格式之间的关键区别,即 tar-gz 是“压缩档案”,而 zip / 7z 是“压缩文件的档案”。事实上,两种文件格式都使用相同的压缩算法(默认情况下),而 .tar.gz 文件通常较小的唯一原因是因为它们压缩整个存档而不是逐个文件,这增加了整体压缩率.
AFAIK,大多数电脑游戏都使用 zip 格式或与之密切匹配的自定义格式,因为它会按文件压缩。例如,Quake 引擎一直(.pak、.pk3、.pk4)依赖于现成的 zip 格式,并添加了一些小的附加功能(我认为像内置校验和)。
.tar.gz 格式是通过首先制作一个将所有(未压缩的)文件放入一个 .tar 文件的存档来创建的。然后,使用 gzip 方法压缩该大存档文件以创建最终的 .tar.gz 文件。关键是要从存档中获取任何一个文件,您必须解压缩整个文件。这非常适合备份或大型传输,但根本不适合游戏引擎媒体存档。
也就是说,从技术上讲,您可以执行与 tar-gz 相反的操作,即使用 gzip 单独压缩每个文件,然后将它们放在一个 .tar 存档中。但这可能不值得额外的麻烦,因为它几乎就是 zip 文件的内容(在“一个简单的步骤”中)。因此,使用像 zip 这样现成的一体化格式会容易得多,它允许您一次提取单个文件。有许多现成的库可用于提取和处理 zip 存档中的文件,只需以 libzip 开头(不要与 zlib(用于 gzip 或 .gz)混淆)。
在 Unix 世界中,有一种著名的格式叫做“tar.gz”。
“tar-ballz”在类 Unix 系统中如此流行和著名的最大原因可能是它们保留了文件权限(我猜还有其他元数据)。我认为 zip 和 7z 的某些实现可能会提供该功能作为格式的扩展,但大多数都没有。使用 tar 存档的方便之处在于,您放入其中的任何内容在另一端输出完全相同,所有权限和其他任何内容都保留。 “gzip”压缩(来自 zlib)在历史上只是一种行业标准的压缩算法,尽管现在有更好的压缩算法,tar 也支持,例如 .tar.lzma(或 .tlz)或 .tar。 xz。
但是其他格式呢?
实际上并没有那么多其他格式。大多数情况下,压缩存档格式通常会重复使用相同的少数算法(DEFLATE、LZ77 / LZMA / LZMA2、BZIP 等),并且通常,像 zip / 7z / rar 这样的格式只是可以使用任何这些压缩算法的真正容器格式(甚至根据单个文件类型进行混合和匹配)。关键是你不会真正找到比 zip 或 7z 更好的东西。他们的竞争对手今天或多或少已经消失了(比如 rar?)。
我应该使用 *.tar 还是其他可用的解决方案?
不,使用 zip 或 7z。焦油球用于备份。它们为此目的进行了优化(例如,将一个装满文件的大文件夹转储到一个 tar-ball 中,然后在以后恢复它,保留所有内容并使用最佳的完整存档压缩)。对于您的应用程序,zip 或 7z 更合适。
【讨论】:
7z
归档还允许 solid compression,这与归档后压缩使用的方法更相似 - 只是具有可变块大小,允许您在随机搜索性能和每个存档的文件大小。以上是关于我应该使用 .tar.gz 吗?的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用啥 ruby gem 来处理 tar 存档操作?
使用 PHP,我如何识别(如果适用,解压缩)并从 .tar、.gz、.tar.gz、.zip 文件中提取文件?