我必须提取数百个大小为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个)
我该如何解决? 有什么进一步的想法来加速提取?
答案 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()