我试图设置一个代码来将一些大文件(从几十到几百GB)打包到一个存档中。 tarfile模块支持的压缩方法对于如此大量的数据来说有点慢,所以我想使用像lz4这样的外部压缩模块来实现更好的压缩速度。不幸的是,我无法找到一种方法来创建tar文件并使用lz4动态压缩它以避免创建临时tar文件。 tarfile模块的文档说明有一种方法可以使用' w |'来打开未压缩的流进行写入。模式。这是将tar文件直接流式传输到lz4模块的方法吗?如果是这样,使用它的正确方法是什么?非常感谢你。
答案 0 :(得分:4)
根据我们上面的谈话。
import tarfile
import subprocess
p = subprocess.Popen(['lz4', '-'], stdin=subprocess.PIPE)
tar = tarfile.open(fileobj=p.stdin, mode="w|")
从那里你可以做通常的tar.addfile
。仅供参考:正如我在谈话中所说的那样。 GNU tar可以自动检测gz和bz2但不能自动检测lz4。只是一张纸条。所以你必须lz4 -c -d stdin.lz4 | tar xf -
来提取文件。如果您只是tar xf
,它就会失败。
答案 1 :(得分:1)
您可以将tar
命令的结果直接传递给lz4
实用程序。这将避免使用任何中间文件。以下是一个示例(假设您的系统上同时安装了tar
和lz4
):
tar cvf - * | lz4 > mypack.tar.lz4
此处-
告诉您将结果从tar
输出到stdout
。当然,您可以使用您想要tar的目标更改*
。
也可以进行相反的操作:
lz4 -d mypack.tar.lz4 | tar xv