简而言之:Deflate 压缩只能与-tzip
7zip 中的 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标准版本。此分支支持附加编解码器,压缩和解压缩速度非常快。
以下是所使用的编解码器的简短摘要:
LZ4 - 压缩/解压缩速度最快,但压缩率不高
Lizard / LZ5 - 比 LZ4 压缩率更高,解压速度也比 LZ4 更快……但压缩速度稍慢
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
,你也可以尝试快星我针对许多小文件的情况进行了优化。