Python - 并行解压缩.gz文件

时间:2016-03-02 08:05:37

标签: python python-2.7 gzip gz

我有多个.gz文件,总共加起来1TB。 如何利用Python 2.7并行解压缩这些文件? 循环文件需要花费太多时间。

我也试过这段代码:

Android

但是我收到以下错误:

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

谢谢!

1 个答案:

答案 0 :(得分: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文件在物理上相邻,对于不同位置(在使用多处理时更频繁地调用)的频繁磁盘读取将比通过执行这些操作文件更慢逐个文件(连续)。