因此,我需要使用最大压缩率来压缩目录。

如何用xz做到这一点?我的意思是我也将需要tar,因为我无法仅使用xz压缩目录。是否有一个单线生产例如foo.tar.xz

评论

FWIW,人1 xz表示,像gzip(1)和bzip2(1)一样,对所有内容盲目使用-9不是一个好主意。 -7 ... -9 [...]仅在分别压缩大于8 MiB,16 MiB和32 MiB的文件时有用。 RTFM了解更多信息。

#1 楼

假设xz遵循标准的命令行标志集-包括压缩级别标志,则可以尝试:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 


评论


将-9加到xz将使其最大

–bsd
2012年1月12日在21:45



-9e是最好的级别,但是需要很长时间

– KrzysztofKrasoń
16年8月6日在7:34

-9e不会总是给您最好的结果-请在此处查看第8点rootusers.com/13-simple-xz-examples

– KolonUK
19年8月13日在9:09

另外,如果在xz中添加--threads = 0,则可能会看到明显的改进

– KolonUK
19年8月13日在9:27

@KolonUK阅读该文章,它表明-e(极端模式)始终可以提高压缩率;比较是在-0e和-6之间;尽管-e始终可以在相同压缩级别内提高压缩率,但较高的压缩级别可能比“极限模式”更有效。没有证据表明-9e的压缩率比-9差。

–staticfloat
20 Mar 26 '20 at 17:59

#2 楼

在bash或派生shell上使用最新的GNU tar

XZ_OPT=-9 tar cJf tarfile.tar.xz directory


tar的小写j开关使用bzip,大写J开关使用xz。

XZ_OPT环境变量使您可以设置xz选项,这些选项无法通过调用应用程序(例如tar)传递。

现在这是最大的。 br />
XZ_OPT=-e9 tar cJf tarfile.tar.xz directory


评论


不,你没有。这就是重点。您可以只为该调用设置环境var。如果需要,可以将其导出,但不必这样做。

–bsd
13年4月23日在9:36

您假设是类似bash的外壳。

– anddam
13年4月29日在19:56

@ anddam,Bourne家族的所有shell(Bourne,ksh,mksh,pdksh,ash,dash,bash,yash,zsh)以及rc和akanga都支持。鱼,csh,tcsh和es是不支持它的主要外壳。在那里,您将使用env命令。

–StéphaneChazelas
2015年1月20日10:33



仅作记录:XZ_OPT不是tar中实现的功能。这是xz的功能。当tar调用xz时,只会传递env变量。

– Sven
17年11月20日在12:37

XZ_OPT = -e9T0 tar cJf tarfile.tar.xz目录。 T0-指定要使用的工作线程数。将线程设置为特殊值0将使xz使用的线程数与系统上有CPU内核的线程数相同。

–user3439968
19年8月14日在23:27

#3 楼

XZ_OPT=-9e tar cJf tarfile.tar.xz directory


甚至比

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

更好

评论


这样更好吗e标志做什么?

–cxdf
15年8月6日在14:17

选项-e,--extreme修改压缩预设(-0 ... -9),以便在不增加压缩器或解压缩器的内存使用量的情况下实现更好的压缩率(例外:压缩器内存使用量可能会增加一点)预设-0 ... -2)。缺点是压缩时间会急剧增加(很容易翻倍)。

–小Evandro
16-4-25在8:46



因此,如果我要在计算机上压缩大约80GB的软件(当我希望所有计算机资源都进入压缩过程以提高速度时),我应该使用-9而不是-9e,是吗?

– nyxee
17年8月28日在21:13

默认情况下,xz使用1个内核/线程,您可以通过添加-T0来最大程度地提高(加速),例如XZ_OPT =“-9e -T0” tar -cJf ...

– EkriirkE
19年1月28日在22:53

#4 楼

如果您有16 GiB的RAM(并且没有其他任何运行),则可以尝试:相应地调整以减少内存量。

这仅在数据实际上那么大时才有用,并且在任何情况下都无济于事,但仍然...
如果要压缩二进制文件,请添加--x86作为第一个xz选项。如果您正在播放“多媒体”文件(未压缩的音频或位图),则可以尝试使用--delta = dist = 2(使用值的实验,尝试的值是1..4)。

如果您非常喜欢冒险,可以尝试使用更多LZMA选项,例如

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 


(这些是默认设置,您可以尝试0到0之间的值和4,且lc + lp不得超过4)

为了查看默认预设如何映射到这些值,可以检查源文件src / liblzma / lzma / lzma_encoder_presets.c。没什么有趣的(-e将长度设置为273并调整深度)。

#5 楼

您可能会尝试其他选项,对我来说-4e效果更好

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 


我通过运行测试过: >因此,似乎选项-4e比-9e更好。

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2


评论


这确实无法回答问题。这只是一个观察结果,对于您的特定小数据集,-4e已经获得了最佳压缩,因此更高级别的使用不再有任何好处(甚至是很小的损失)。

–psusi
15年1月16日在16:00

您与Szymon Roziewski是同一用户吗?如果是这样,请不要发布多个答案。而是编辑原始答案。如果您无法访问您的第一个帐户,请参阅此处以了解如何合并您的帐户。同时,我正在删除您以前的答案,并将其包括在此处。

– terdon♦
2015年1月16日在16:35



好的,我对此进行了更全面的研究。我得到的是这里。我从hardrive中选择了一些文件,并使用选项-4e和-9e进行了压缩。因此,最好自己找到最佳解决方案。您是对的,在某些情况下-9e更好,而在另一些情况下则不是:无差异= 660 4e优于9e = 74 9e优于4e = 17总文件= 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17其他109 pdf 133135 jpg 270

– Szymon Roziewski
2015年1月20日9:51



(注释只能编辑5分钟)txt 109 txt / pdf 135

– Szymon Roziewski
15年1月20日在9:59



+1。这确实有助于OP找到一种方法来确定使用xz的文件压缩的​​最大压缩率。

– cychoi
2015年2月10日在7:56

#6 楼

tar命令对xz文件使用J标志。例如:

tar -cJvf foo.tar.xz foo/

评论


bdowning的答案中已经提到了J

–安东
2014年1月8日在22:58

#7 楼

tar --help-I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    


也可以使用外部压缩机压缩:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/


解压缩外部压缩机:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  


列表存档外部压缩器:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst


评论


这似乎是一个可行的答案,但实际上,通过固定其格式并添加选项-I的说明,可以大大改善此问题。

– dhag
17-10-27在15:12

#8 楼

在xz-utils v5.2.0版的多核计算机中,检查: >
-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0


或将-T设置为要使用的内核数。

然后:

export XZ_DEFAULTS="-9 -T 0 "


这对于选择压缩级别也可能有用:

#9 楼

对于那些感兴趣的人,与典型笔记本电脑上的-e9相比,-9小0.4%,压缩时慢20%,解压慢3%。这是在Python源代码目录结构上运行的时间。

压缩: >
$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861


文件大小:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443


评论


选择错误的变量名,因为T0是启用多线程归档的选项。

– Dzenly
19年6月8日在14:13

@Dzenly你是对的!谢谢!改了

–滚刀
19年6月9日在13:32



#10 楼

如果您希望使用多个线程来完成此任务更快,但又不降低系统执行其他工作时的速度,请尝试添加-Tn(其中n是您要使用的线程数)以及nice,以将压缩降级为空闲优先级。

模型(4个线程):

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz


在大目录中进行尝试时请尝试在tophtop中观看(几个GB )。您应该希望看到几个xz线程,其Nice值为19(最低优先级)。 ,因为-f -的默认输出是stdout。

您也可以tar tar进程,但是我从来没有发现它是必需的,因为nice总是阻塞管道的CPU。可以解决任何问题,不是因为CPU或时间太长,而是因为内存需求很高。看看https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_requirements_on_compression。 xz压缩器与xz -9类似,但与xz不同,它为更高的压缩系数使用更多的内存。再加上bzip2使用的内存远远超过其他任何压缩器,则可以轻松使用600+ MB的内存。而且,如果使用gzip启用线程压缩,则内存需求将进一步上升。只是要注意一点,例如,如果您在具有1-2 GB内存的小型VM上运行一些小型服务,则可能会无意中造成影响。

#11 楼

这不是您问题的确切答案,但您可以使用一个命令而不是两个命令:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1


将目录“ dir1”中的所有文件添加到archive.7z “ ultras ettings”

还支持其他格式:zip,gzip,bzip2或tar。为此,只需在7z之后替换-t。 。

评论


问题是关于xz的问题,而不是关于7z的问题,即使它们都使用LZMA压缩。

– Amedee Van Gasse
15年7月22日在7:57

#12 楼

在Mac OS X上,通过tar传递参数的另一种方法是使用--options=标志。例如,

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName


#13 楼

最大压缩率取决于您要对其应用设备的功能。最大压缩会导致其持续时间在直径上延长,从而产生大量硬件资源负载。因此,不建议最大程度地利用服务器资源(CPU / RAM /磁盘),以免减慢其上运行的其他服务的工作。值得考虑的是压缩程度与其持续时间/系统负载之间的折衷。

在我的情况下,我在笔记本电脑上使用xz(因此我使用了最大的硬件功能),并且选择了最多的参数-CPU线程,内存RAM限制和磁盘性能。我实验性地选择了压缩级别,并且对DictSize = 32 MiB选项而言,它对我而言效果最佳。以下是所使用命令的语法压缩级别
-M-RAM使用限制(以GB为单位)
-T-使用的处理器线程数
请参阅下面的prtsc:



由于我从SD内存读取速度的限制,我故意不使用动态压缩(不使用管道)笔记型电脑(最大〜28 MB / s)。我使用dd命令

xz -k -8e -M 7000MB -T 8 -v sd-dump-rpi3b+-strech.img


或选项完全使用dd语法将系统映像从sd卡转储到ssd磁盘:

然后将其压缩。这样,我绕过了SD卡的数据传输速度瓶颈,并使用了最大的速度:CPU线程,内存RAM和SSD(读/写〜540 MB / s)

值得考虑的事实是,所使用的sd卡的容量为32GB,系统使用的容量约为3.6GB。压缩前,卡转储的重量约为29GB,压缩后约为1.GB。空卡空间约为28.4GB,还压缩了约3.6GB的数据-主要是二进制文件。假设3.6到1.7会给出50%的压缩率,压缩时间约为15分钟,这是令人满意的效果。我故意跳过了自由空间压缩,因为在此过程中,我注意到压缩时间从最初计算的约45分钟开始迅速减少,并且将SSD磁盘的瞬时使用增加到了约266MB / s(脉冲)。

值得一提的是,在高压缩级别下,大量的CPU线程(例如,对于我来说,在-8e时为8个线程)和无法正确使用的RAM数量导致线程数xz减少(不超过所声明的内存使用限制)。

RAM内存限制和CPU线程的数量可以让你保持足够的性能和快速的压缩,而不用尽硬件资源(CPU和RAM)的适当选择。

我正在研究中使用以下软件:
硬件

IdeaPad Z580


i7-3632QM
2 x 4 GB SODIMM DDR3同步PC3-12800(1600 MHz)
SSD IRSSDPRS25A120

软件:


Debian Stretch(x86_64)
内核4.9.0-11-amd64
xz(XZ Utils)5.2.2
liblzma 5.2.2

有关在man xz中优化使用xz的可能性的更多信息。

评论


请注意,该线程迄今为止已被读取104k次。确保添加一些与众不同的东西。到目前为止,我还没有看到这篇文章对整个主题的贡献。与编写一个单行代码有什么不同:xz -k -8e -M 7000MB -T 8 -v what.img?例如,它已经在此处发布了,但不完全相同,但是使用指出的XZ_OPT语法更好。干杯。

– LinuxSecurityFreak
20年1月20日在13:48

我从技术方面分享我的经验。该示例基于我上面编写的语法xz(XZ Utils)5.2.2(带有man xz)。我认为该测试可以更全面地了解xz的使用情况,并提供一个示例,供进一步测试以优化压缩率,性能和设备负载。问候。

–亚当·沃多夫斯基(AdamWądołkowski)
20年1月20日在16:22