使用Python提取tar文件的最快方法

时间:2014-09-21 15:07:02

标签: python multiprocessing

我必须提取数百个大小为5GB的tar.bz文件。所以尝试了以下代码:

import tarfile
from multiprocessing import Pool

files = glob.glob('D:\\*.tar.bz') ##All my files are in D
for f in files:

   tar = tarfile.open (f, 'r:bz2')
   pool = Pool(processes=5)

   pool.map(tar.extractall('E:\\') ###I want to extract them in E
   tar.close()

但代码有类型错误: TypeError:map()至少需要3个参数(给定2个)

我该如何解决? 有什么进一步的想法来加速提取?

2 个答案:

答案 0 :(得分:3)

定义一个提取单个tar文件的函数。将该函数和tar文件列表传递给multiprocessing.Pool.map

from functools import partial
import glob
from multiprocessing import Pool
import tarfile


def extract(path, dest):
    with tarfile.open(path, 'r:bz2') as tar:
        tar.extractall(dest)

if __name__ == '__main__':
    files = glob.glob('D:\\*.tar.bz')
    pool = Pool(processes=5)
    pool.map(partial(extract, dest='E:\\'), files)

答案 1 :(得分:0)

您需要将pool.map(tar.extractall('E:\\')更改为pool.map(tar.extractall(),"list_of_all_files")

注意map()首先获取2个参数是一个函数,第二个是可迭代的,并且将函数应用于每个iterable项并返回结果列表。

编辑:您需要将TarInfo对象传递到另一个进程:

def test_multiproc():
    files = glob.glob('D:\\*.tar.bz2')
    pool  = Pool(processes=5)
    result = pool.map(read_files, files)


def read_files(name):

 t = tarfile.open (name, 'r:bz2')
 t.extractall('E:\\')
 t.close()

>>>test_multiproc()