.tar.gz 和 .zip打包 的区别

 

背景

传输一些LLM的权重文件,很大,scp 总是丢包,想着打包再分成一个个2G的小数据包好传输

但是zip之后发现,zip压缩包无法直接split 拆分,tar.gz 反而可以

tar.gz 和zip 区别

tar.gz 可以用split 拆分成很多小包,zip不行

tar -czvf - opt-6.7b | split -b 1G - opt-6.7b

 
cat opt-6.7b* > opt-6.7b.tar.gz

合并,直接cat > 即可

文件结构:

tar(Tape Archive)最初是为了将文件打包到磁带备份系统中而设计的。tar 本身只打包文件和目录为一个单一的文件,不进行压缩。要进行压缩,通常会结合使用 gzip(.gz),bzip2(.bz2)等压缩工具,这也是为何我们常见的格式是 .tar.gz 或 .tar.bz2

zip 格式同时支持打包(archiving)和压缩(compression),它把文件和目录打包成一个 .zip 文件,并且在这个过程中就可以进行压缩。

压缩算法

gzip 使用的是 DEFLATE 压缩算法,适用于对文本和数据文件进行压缩。

zip 也可以使用 DEFLATE 算法,但是 zip 格式允许每个文件使用不同的压缩算法。

文件拆分:

当使用 tar -czvf - file | split -b size - prefix 这样的命令时,tar 打包并由 gzip 压缩的数据流直接被 split 命令拆分成多个文件。因为这些分割的文件最终会被再次合并,所以压缩数据流的完整性是可以保证的。

zip 文件格式是将文件目录信息和压缩文件的数据存储在同一个文件中。如果尝试用 split 直接拆分一个 zip 文件,那么分割后的小文件中的目录信息将不完整,因此无法直接通过合并分割文件来还原原始的 zip 文件。 也就是说,你可以在压缩过程中将 tar.gz 流式传输并拆分为多个文件,但对于 zip 文件,由于格式的限制,这样做会破坏文件结构,使得无法正确解压。

历史

zip 格式的设计理念与 tar 相比有一些差异,主要是因为它们各自的历史和目的不同。

zip 文件格式是由 Phil Katz 在 1989 年创建的,它就是为了同时支持文件的打包(归档)和压缩而设计的。zip 格式允许每个文件单独压缩,并且存储了关于文件的元数据,例如文件名、目录结构、文件日期和时间等。因为每个文件是独立压缩的,zip 文件格式支持随机访问,这意味着可以提取压缩包中的单个文件而不必解压整个文件。

zip 文件的这种设计(尤其是文件目录的存在)使得流式传输或拆分已经压缩的 zip 文件变得复杂,因为压缩包的文件目录通常存储在文件的末尾。如果用 split 直接拆分 zip 文件,就会破坏这些关键的元数据部分,使单个拆分的文件片段变得不完整,无法独立解压。

总结

zip的特性是支持单独文件压缩,可以随机访问,可以提取压缩包中单个文件,但是不支持拆分了

tar.gz 这种 不支持单独压缩,支持拆分