【问题标题】:Fastest way to extract tar files using Python使用 Python 提取 tar 文件的最快方法
【发布时间】:2014-09-22 05:12:55
【问题描述】:

我必须提取数百个 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 个)

我该如何解决? 有什么加快提取速度的想法吗?

【问题讨论】:

  • 我打赌你的问题是 I/O 而不是代码。 map 错误很明显:您必须提供一个函数和该函数的参数列表。您的案例:map(extractall, [list, of, files])
  • 如何提供目标目录?地图(提取全部,[列表,文件])
  • 每个文件的目标不同? [(list, dest), (of, dest2), (files, dest3)]。同一个目标?为extractall 创建一个functools.partial
  • 实际上每个文件的目标相同。

标签: python multiprocessing


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

注意map() 有 2 个参数,第一个是一个函数,第二个是一个可迭代对象,然后将函数应用于可迭代对象的每个项目并返回结果列表。

编辑:您需要将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()

【讨论】:

  • E 是存放解压文件的目标目录。
  • 那么是不是一定要用tar = tarfile.open(f, 'r:bz2')?
  • 是的,我认为您可以在tar.extractall 中使用TarFile.getmembers()
  • 对不起,我听不懂你说的;等待您的完整解决方案。
  • 我编辑了答案,你能试一试并给我结果吗?
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2021-10-10
  • 2012-06-13
相关资源
最近更新 更多