Python - 并行解压缩 .gz 文件

5
我有多个总共达到1TB的.gz文件。 如何使用Python 2.7并行解压这些文件? 循环文件需要太多时间。
我也尝试了以下代码:
filenames = [gz for gz in glob.glob(filesFolder + '*.gz')]

def uncompress(path):
    with gzip.open(path, 'rb') as src, open(path.rstrip('.gz'), 'wb') as dest:
        shutil.copyfileobj(src, dest)

with multiprocessing.Pool() as pool:
    for _ in pool.imap_unordered(uncompress, filenames, chunksize=1):
        pass

但是我遇到了以下错误:

  with multiprocessing.Pool() as pool:

AttributeError: __exit__

谢谢!


要使用with结构,内部使用的对象必须具有__enter____exit__方法。错误提示表明Pool类没有这些方法,因此无法在with语句中使用它。 - 0xc0de
不完全是重复,我认为,但也许这个答案可以帮助?这里 - SiHa
3
旁注:您确定CPU是瓶颈吗?您可能会遇到后端存储(磁盘?)可以处理的IO限制。我猜测并行运行多个解压缩任务会使情况变得更糟(考虑寻道时间)。 - dhke
关于IO瓶颈的想法的后续 - 在解压缩之前,也许可以将文件复制到RAM磁盘中? - SiHa
1个回答

0
要使用with结构,内部使用的对象必须具有__enter____exit__方法。错误提示说Pool类(或实例)没有这些方法,因此无法在with语句中使用它。 尝试这样做(只需删除with语句):
import glob, multiprocessing, shutil

filenames = [gz for gz in glob.glob('.' + '*.gz')]

def uncompress(path):
    with gzip.open(path, 'rb') as src, open(path.rstrip('.gz'), 'wb') as dest:
        shutil.copyfileobj(src, dest)


for _ in multiprocessing.Pool().imap_unordered(uncompress, filenames, chunksize=1):
    pass

编辑

我同意@dhke的观点,除非所有(或大多数)gz文件在物理上相邻,否则频繁地读取不同位置的磁盘(在使用多进程时更常见)将比逐个文件逐个操作(串行地)慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接