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

使用Python提取tar文件的最快方法,python,multiprocessing,Python,Multiprocessing,我必须提取数百个tar.bz文件,每个文件的大小为5GB。因此尝试了以下代码: 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.extrac

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

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个)

我怎样才能解决它?
有没有进一步加快提取的想法?

您需要将
pool.map(tar.extractall('E:\'))
更改为类似于
pool.map(tar.extractall(),“列出所有文件”)

请注意,
map()
接受2个参数,第一个参数是函数,第二个参数是iterable,将函数应用于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()

定义一个提取单个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)

我打赌你这里的问题是I/O而不是代码。
map
错误很明显:你必须提供一个函数和该函数的参数列表。你的案例:
map(extractall,[list,of,files])
我如何提供目标目录?map(extractall,[list,of,files])每个文件有不同的目标?
[(list,dest),(of,dest2),(files,dest3)]
。相同的目标?为
提取所有文件创建一个
functools.partial
。实际上每个文件都有相同的目标。E的可能副本是放置提取文件的目标目录。因此不需要使用tar=tarfile.open(f,'r:bz2')?是的,我想你可以使用
TarFile.getmembers()
inside
tar.extractall
抱歉,我听不懂你说的话;等待你的完整解决方案。我编辑了答案,你能试试并告诉我结果吗?另外,你可以看看concurrent.futures.ProcessPoolExecutor()