我正在尝试设置一个代码,将几个大文件(从数十到数百GB)打包成一个归档文件。Tarfile模块支持的压缩方法对于这么多数据来说有点慢,所以我想使用一些外部压缩模块,比如lz4,以实现更快的压缩速度。不幸的是,我找不到一种方法,在创建临时tar文件之前流式传输tar文件并用lz4进行压缩。Tarfile模块的文档说明有一种方式可以使用“w|”模式打开未压缩的写入流。那么,这是直接将tar文件流传输到lz4模块的方法吗?如果是,正确的使用方法是什么?非常感谢。
import tarfile
import subprocess
p = subprocess.Popen(['lz4', '-'], stdin=subprocess.PIPE)
tar = tarfile.open(fileobj=p.stdin, mode="w|")
从那里,您可以执行通常的tar.addfile
操作。FYI:如我在对话中所述,GNU tar可以自动检测gz和bz2,但不能检测lz4。只是一个注释。因此,您需要执行lz4 -c -d stdin.lz4 | tar xf -
来提取文件。如果仅使用tar xf
会失败。
tar
命令的结果直接传输到lz4
实用程序中。这将避免使用任何中间文件。这是一个例子(假设您的系统上都安装了tar
和lz4
):
tar cvf - * | lz4 > mypack.tar.lz4
这里的-
表示将结果从tar
输出到stdout
。当然,您可以将*
更改为您想要打包的任何目标。
反向操作也是可能的:
lz4 -d mypack.tar.lz4 | tar xv
lz4
命令,并将文件对象传递给tarfile.open
函数。 - Kenji Noguchi