Python 并行处理解压缩文件
Python parallel processing to unzip files
我是 python 中并行处理的新手。我在下面有一段代码,遍历所有目录并解压缩所有 tar.gz 文件。但是,这需要相当多的时间。
import tarfile
import gzip
import os
def unziptar(path):
for root, dirs, files in os.walk(path):
for i in files:
fullpath = os.path.join(root, i)
if i.endswith("tar.gz"):
print 'extracting... {}'.format(fullpath)
tar = tarfile.open(fullpath, 'r:gz')
tar.extractall(root)
tar.close()
path = 'C://path_to_folder'
unziptar(path)
print 'tar.gz extraction completed'
我一直在浏览一些有关 multiprocessing 和 joblib 包的帖子,但我仍然不清楚如何将我的脚本修改为 运行 并行。感谢任何帮助。
编辑:@tdelaney
感谢您的帮助,令人惊讶的是修改后的脚本花费了两倍的时间来解压缩所有内容(60 分钟与原始脚本的 30 分钟相比)!
我查看了任务管理器,似乎虽然使用了多核,但 CPU 使用率很低。我不确定为什么会这样。
创建池来完成这项工作非常容易。只需将提取器拉出到一个单独的工作器中即可。
import tarfile
import gzip
import os
import multiprocessing as mp
def unziptar(fullpath):
"""worker unzips one file"""
print 'extracting... {}'.format(fullpath)
tar = tarfile.open(fullpath, 'r:gz')
tar.extractall(os.path.dirname(fullpath))
tar.close()
def fanout_unziptar(path):
"""create pool to extract all"""
my_files = []
for root, dirs, files in os.walk(path):
for i in files:
if i.endswith("tar.gz"):
my_files.append(os.path.join(root, i))
pool = mp.Pool(min(mp.cpu_count(), len(my_files))) # number of workers
pool.map(unziptar, my_files, chunksize=1)
pool.close()
if __name__=="__main__":
path = 'C://path_to_folder'
fanout_unziptar(path)
print 'tar.gz extraction has completed'
我是 python 中并行处理的新手。我在下面有一段代码,遍历所有目录并解压缩所有 tar.gz 文件。但是,这需要相当多的时间。
import tarfile
import gzip
import os
def unziptar(path):
for root, dirs, files in os.walk(path):
for i in files:
fullpath = os.path.join(root, i)
if i.endswith("tar.gz"):
print 'extracting... {}'.format(fullpath)
tar = tarfile.open(fullpath, 'r:gz')
tar.extractall(root)
tar.close()
path = 'C://path_to_folder'
unziptar(path)
print 'tar.gz extraction completed'
我一直在浏览一些有关 multiprocessing 和 joblib 包的帖子,但我仍然不清楚如何将我的脚本修改为 运行 并行。感谢任何帮助。
编辑:@tdelaney
感谢您的帮助,令人惊讶的是修改后的脚本花费了两倍的时间来解压缩所有内容(60 分钟与原始脚本的 30 分钟相比)!
我查看了任务管理器,似乎虽然使用了多核,但 CPU 使用率很低。我不确定为什么会这样。
创建池来完成这项工作非常容易。只需将提取器拉出到一个单独的工作器中即可。
import tarfile
import gzip
import os
import multiprocessing as mp
def unziptar(fullpath):
"""worker unzips one file"""
print 'extracting... {}'.format(fullpath)
tar = tarfile.open(fullpath, 'r:gz')
tar.extractall(os.path.dirname(fullpath))
tar.close()
def fanout_unziptar(path):
"""create pool to extract all"""
my_files = []
for root, dirs, files in os.walk(path):
for i in files:
if i.endswith("tar.gz"):
my_files.append(os.path.join(root, i))
pool = mp.Pool(min(mp.cpu_count(), len(my_files))) # number of workers
pool.map(unziptar, my_files, chunksize=1)
pool.close()
if __name__=="__main__":
path = 'C://path_to_folder'
fanout_unziptar(path)
print 'tar.gz extraction has completed'