gpt4 book ai didi

python - Python 中的 Tarfile : Can I untar more efficiently by extracting only some of the data?

转载 作者:太空狗 更新时间:2023-10-29 21:34:21 25 4
gpt4 key购买 nike

我正在从 USGS 订购一大堆陆地卫星场景,这些场景作为 tar.gz 存档。我正在编写一个简单的 python 脚本来解压缩它们。每个文件包含 15 张大小为 60-120 MB 的 tiff 图像,总计刚刚超过 2 GB。我可以使用以下代码轻松提取整个文件:

import tarfile
fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName, 'r:gz')
tfile.extractall("newfolder/")

我实际上只需要这 15 个 tiff 中的 6 个,在标题中标识为“带”。这些是一些较大的文件,因此它们加在一起约占数据的一半。所以,我想我可以通过如下修改代码来加快这个过程:

fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName, 'r:gz')
membersList = tfile.getmembers()
namesList = tfile.getnames()
bandsList = [x for x, y in zip(membersList, namesList) if "band" in y]
print("extracting...")
tfile.extractall("newfolder/",members=bandsList)

但是,向两个脚本添加计时器显示第二个脚本没有显着的效率提升(在我的系统上,两个脚本在一个场景中运行大约一分钟)。虽然提取速度稍快一些,但似乎这种增益被确定首先需要提取哪些文件所需的时间所抵消。

问题是,这种权衡是我正在做的事情固有的,还是我的代码效率低下的结果?我对 python 比较陌生,今天才发现 tarfile,所以如果后者是真的,我也不会感到惊讶,但我还没有找到任何关于仅有效提取文件的一部分的建议。

谢谢!

最佳答案

通过将 tar 文件作为流打开,您可以更有效地做到这一点。( https://docs.python.org/2/library/tarfile.html#tarfile.open )

mkdir tartest
cd tartest/
dd if=/dev/urandom of=file1 count=100 bs=1M
dd if=/dev/urandom of=file2 count=100 bs=1M
dd if=/dev/urandom of=file3 count=100 bs=1M
dd if=/dev/urandom of=file4 count=100 bs=1M
dd if=/dev/urandom of=file5 count=100 bs=1M
cd ..
tar czvf test.tgz tartest

现在这样读:

import tarfile
fileName = "test.tgz"
tfile = tarfile.open(fileName, 'r|gz')
for t in tfile:
if "file3" in t.name:
f = tfile.extractfile(t)
if f:
print(len(f.read()))

注意打开命令中的|。我们只读取了 file3

$ time python test.py

104857600

real 0m1.201s
user 0m0.820s
sys 0m0.377s

如果我将 r|gz 改回 r:gz 我得到:

$ time python test.py 
104857600

real 0m7.033s
user 0m6.293s
sys 0m0.730s

大约快 5 倍(因为我们有 5 个同样大小的文件)。之所以如此,是因为标准的打开方式允许向后查找;它只能通过提取在压缩的 tarfile 中执行此操作(我不知道这样做的确切原因)。如果您以流的形式打开,则不能再随机查找,但如果您按顺序阅读(在您的情况下是可能的),速度会快得多。但是,您不能再预先访问 getnames。但在这种情况下没有必要这样做。

关于python - Python 中的 Tarfile : Can I untar more efficiently by extracting only some of the data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26067471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com