与MacOS Tar相比,在使用Python的焦油时,为什么ktr.xz文件15x更小?

2021-03-15 06:29:36

我压缩〜1.3 gb文件夹每个填充1440个json文件,并在麦斯科斯或raspbian 10(buster)上使用tar命令和使用python' sa'在使用python' sa&#39之间的差异。在Tar​​file库中。

#!/ usr / bin / env python3 from pathlib导入路径从子进口导入callimport tarfilefullpath = path(" /用户/桌面/ temp / tar / mater / moder / desktop / temp / tar / 2021-03-11")zsh_out = path(fullpath.parent ," zsh-archive.tar.xz")py_out = path(fullpath.parent," py-archive.tar.xz")#tar使用终端#tar cjf zsh-inshive。 tar.xz folderpathcall([" tar" cjf",zsh_out,fullpath])#tar使用tarfile.open(py_out," w:xz" )作为tar:tar.add(fullpath,arcname = fullpath.stem)#print filesizateprint(f" zsh tar文件大小:{round(path(zsh_out).stat()。st_size /(1024 * 1024),2) MB")打印(f" py tar文件大小:{round(path(pat_out).stat()。st_size /(1024 * 1024),2)} mb")

如果我用QuickLook(和betterzip插件)检查档案,我会看到存档中的文件以不同的方式排序:

zsh存档使用未知的顺序,并且Python归档通过修改日期命令文件。我不确定是否重要。

到底是怎么回事?我是通过使用Python库压缩我的数据的东西吗?是一个15倍的差异,一个问题的指标?或者我可以安全地继续使用高效的Python实现?

8您是否确保了Tar CJF的结果实际上是XZ压缩? XZ也使用LZMA,但它是一种不同的格式,例如7-zip。尝试文件archive.tar.xz。 - Daniel B.

在这两种情况下,您是否实际上是在同一个目录树上?只是确保;-) - tink.

嗯,好的。请验证未压缩的.tar文件是否相同。文件可能已以不同的顺序添加,从而创建不同的压缩结果。 - Daniel B.

@Tink,是的,我这样做。我在我的问题中添加了一个testscript,它显示了正在压缩的相同目录,生成众多不同的文件。 - SaaruLindestøkke.

好的,我想我发现了问题:BSD Tar和GNU Tar没有任何排序选项,以未定义的顺序将文件放在存档中。

根据顺序对目录条目进行排序,这是无,名称或inode之一。默认值为-sort = none,以与操作系统返回的顺序存储归档成员。

我获得了1.5 MB的.tar.xz存档,等于Python库创建的存档。

我的JSON文件包含来自数百个传感器的测量值。我每分钟读出所有传感器,但只有少数这些传感器从分钟到分钟的数量不同。通过按名称排序文件(它在它的开头的创建UnixTime),两个后续文件在它们之间具有很小的不同字符.Apparent,这对于压缩效率非常有利。

9压缩程序在由单个字典控制的文本块上运行;通过对输入进行排序,' VE将相似的比特放在彼此附近,允许XZ压缩在一个字典中的大量类似的数据。压缩和减压可能更快。 - 罗吉恩

我没有真正了解,但是为什么操作系统返回&#34的文件;未分发的"使用sort = none选项顺序。我的意思是,总是有些排序顺序,对吗?如果有人知道操作系统使用的订单随意添加。 - SaaruLindestøkke.

@saarulindestøkkke操作系统返回目录中文件的顺序取决于所使用的文件系统(假设使用了相同的操作系统,显然您可以轻松修补Linux,以便默认情况下您想要的某些顺序返回文件或者它将返回文件默认情况下随机化订单)。因此,任何操作系统都没有使用单个排序顺序,因为我们不提供保证和我们说"不要假设任何特定的排序顺序"这并不意味着文件系统以前积极地随机化结果返回它们,只需意味着用户更改FS,结果可能会发生变化 - Bakuriu.

TL:博士:"未归解的"意味着在我们从OS和#39的系统调用中使用DIR条目,您可以使用LS -U查看。 - Peter Cordes.

我知道你在这里询问xz但是在这个答案中解释了这里,在旧版本的gzip上,您可以使用这样的环境变量设置压缩级别:

也就是说,只似乎只使用GZIP 1.8,并且在更高版本上折旧。所以使用-i / --USE-COMPRESS-PROGRAME = CARM命令选项,而不是tar;注意此选项可能无法在MacOS上运行,但无论如何都在此处拨打此处。因此,命令将更改为:

是的,这些示例将压缩归档Gzip而不是XZ,但您可以轻松更改命令以使用如此:

XZ压缩级别范围从-0到-9,默认为-6;所以-9是最高的压缩水平。

请注意,默认情况下,XZ未安装在MacOS上。要在MacOS上安装它,您必须首先安装Homebrew,然后通过如下所示安装XZ:

5我尝试了命令tar -i' xz -9' -cf zsh-archive.tar.xz folderpath,但我收到以下错误:tar:cann' t打开xz -9:没有这样的文件或目录 - SaaruLindestøkke.

在麦斯科斯?我被检查了,它似乎是由我的系统提供的。所以我建议安装HomeBrew然后运行:Brew Install XZ - GIACOMO1968.

是的,在麦克斯。 MAN TAR显示-I选项是-t选项的同义词,它是--files从选项。我尝试过的龙手选项 - 使用-uld-compress程序,它导致了10 MB文件,而不是常规23 MB,但它仍然没有靠近Python的1.5 MB。 - SaaruLindestøkke.

请注意,我也在Raspbian终端中尝试了这一点,结果与我在麦克斯上获得了类似的结果。 - SaaruLindestøkke.

它可能使用Liblzma中的函数调用&#39。 tar可能会通过xz shell命令管道。

“排序”选项是对GNU Tar的相对较近的增强,并在Tar版本1.28中引入。

点击“发布答案”,您同意我们的服务条款,隐私政策和Cookie政策 不是答案你和#39;寻找? 浏览其他标记的问题或提出您自己的问题。