以 7z 格式快速压缩(如 zip 或 gzip)

以 7z 格式快速压缩(如 zip 或 gzip)

简而言之:Deflate 压缩只能与-tzip7zip 中的 zip 格式()一起使用吗?


我想将一个大目录(数百 GiB)从一个磁盘存档到另一个磁盘,同时保持 I/O 速度与不压缩时相同或更好。

出于多种原因,我喜欢 7z 格式,但即使使用 LZMA 和 Bzip2 压缩,速度也太慢了-mx=1。我尝试过7z a -mm=Zip -mx=1 -mmt=4(也-mm=GZip使用 Deflate),但在文件扫描阶段后出现参数错误。 http://7zip.bugaco.com/7zip/MANUAL/switches/method.htm

我的典型解决方案是使用 tar .tar.lzo(LZOP),在默认压缩率下,单线程很容易达到 100 MiB/s;或者.tar.gz使用GZIP=-1。一个非常快的压缩器是使用多线程的 lbzip2,但它不能从 tar 本身运行。

我的源磁盘通常以 20 MiB/s 的速度读取,有时为 100(文件大小为几 MiB);目标写入速度最高为 80 MiB/s。因此,这是压缩器应具有的速度,理想情况下,即使在单线程时也是如此。最多可提供 8 个内核和 16 GB RAM。

答案1

您可以尝试7-Zip Z标准版本。此分支支持附加编解码器,压缩和解压缩速度非常快。

以下是所使用的编解码器的简短摘要:

  1. LZ4 - 压缩/解压缩速度最快,但压缩率不高

  2. Lizard / LZ5 - 比 LZ4 压缩率更高,解压速度也比 LZ4 更快……但压缩速度稍慢

  3. Brotli 和 Zstandard - zstd 通常比 Brotli 快一点,但对于文本内容,Brotli 可能更好一点 ;)

所有 5 个编解码器均支持线程,目前最多 256 个线程。

像这样运行它:

7z a archiv.7z -m0=lz5 -mx1 -mmt=4

7z a archiv.7z -m0=zstd -mx1 -mmt=4

7z a archiv.7z -m0=brotli -mx1 -mmt=1..7z a archiv.7z -m0=brotli -mx1 -mmt=256

等等...

答案2

lbzip2 是一种非常快的压缩器,具有多线程功能,但是它不能从 tar 本身运行。

在 gnu tar 中,你可以用标志指定使用哪个压缩器。示例:tar -I "zstd -T0"tar --use-compress-program=pigz

如果您想要一个快速的单线程压缩器,您可以使用 lz4。

但您不必使用它,您也可以通过您选择的压缩器来传输输出。

# create
tar -c /inputdir | pigz --fast > output.tar.gz
# decompress
pigz -d input.tar.gz | tar -x 

我的源磁盘通常以 20 MiB/s 的速度读取,有时甚至达到 100

这听起来你实际上是在随机访问读取方面遇到了瓶颈,而不是压缩。如果你有大文件,你应该对它们进行碎片整理。如果你有很多小文件,你应该确保磁盘已安装relatime,你也可以尝试快星我针对许多小文件的情况进行了优化。

相关内容