测量

测量

我有一个tar.gz32 GB 的文件。我试图从中提取特定文件夹,因此我使用以下命令列出内容以查看文件结构:

tar -tvf file.tar.gz > files.txt

列出所有文件似乎需要很长时间。我的问题是 -t 标志是否也会提取文件?我知道它不会在磁盘上提取,但它所花的时间让我怀疑它是否真的在某种缓冲区中处理它们。

答案1

tar.gz 文件没有索引。与 zip 或其他存档格式不同,获取所含文件或其他元数据的列表既不简单也不便宜。为了向您显示存档中包含哪些文件,tar 确实需要解压缩存档并提取文件,尽管在此-t选项的情况下它仅在内存中执行此操作。

如果您的用例中的常见模式是列出档案中包含的文件,则您可能需要考虑使用可以向压缩文件添加文件索引的档案格式,例如 zip。

也许你还想看看HDF5适合更复杂场景的格式。

测量

我只需要做一些测量来证明我的答案,并创建一些包含许多文件的目录并将它们打包,tar czf files#.tgz files#并且zip -r files#.zip files#

为了进行测试,我每次运行两次解压命令并获取第二次运行的结果,以尽量避免测量磁盘速度。

测试 1

目录files1包含100,000 个空文件

$ time tar tzf files1.tgz >/dev/null
tar tzf files1.tgz > /dev/null  0,56s user 0,09s system 184% cpu 0,351 total
$ time unzip -l files1.zip >/dev/null
unzip -l files1.zip > /dev/null  0,30s user 0,34s system 99% cpu 0,649 total

zip 在这里比较慢。

测试 2

目录files2包含5,000 个文件,大小为 512 字节每个都是随机数据。

$ time tar tzf files2.tgz >/dev/null
tar tzf files2.tgz > /dev/null  0,14s user 0,03s system 129% cpu 0,131 total
$ time unzip -l files2.zip >/dev/null
unzip -l files2.zip > /dev/null  0,03s user 0,06s system 98% cpu 0,092 total

仍然没有说服力,但这次 zip 更快了。

测试 3

目录files3包含5,000 个 5kB 文件每个都是随机数据。

$ time tar tzf files3.tgz >/dev/null
tar tzf files3.tgz > /dev/null  0,42s user 0,03s system 111% cpu 0,402 total
$ time unzip -l files3.zip >/dev/null
unzip -l files3.zip > /dev/null  0,03s user 0,06s system 99% cpu 0,093 total

在这个测试中可以看出,文件越大,tar 列出它们就越困难。

结论

对我来说,zip 似乎引入了一些开销,您只会在处理许多非常小(几乎是空的)的文件时才会注意到,而对于大量较大的文件,在列出档案中包含的文件时它会赢得竞争。

相关内容