如何使用python多处理优化压缩文件功能?

时间:2014-04-04 01:32:30

标签: python multithreading zip

我有一个将多个文件压缩成一个zip文件的工作函数

targetzipfile = os.path.normpath(targetfolder) + '.zip' 
zipf = zipfile.ZipFile(targetzipfile,'w', zipfile.ZIP_DEFLATED, allowZip64=True)

for root, dirs, files in os.walk(targetfolder):
    for f in files:
        #use relative path zipfile.write(absfilename, archivename), the archive name is the name to be shown in the zip file
        print "compressing: %s" % os.path.join(root,f)
        zipf.write(os.path.join(root,f),os.path.relpath(os.path.join(root,f), os.path.dirname(os.path.normpath(targetfolder)))) #Note here maybe a problem, root/f must 
zipf.close()

但是因为我有很多文件,所以运行速度非常慢。所以我正在寻找一种方法来优化这个循环,在python中使用多处理功能,比如OpenMP。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

import multiprocessing
import time

data = (
    List_of_files
)
targetfolder = "targetFolder"
def mp_worker((inputs, targetfolder)):
    print "compressing: %s" % os.path.join(root,f)
    zipf.write(os.path.join(root,inputs),os.path.relpath(os.path.join(root,inputs), os.path.dirname(os.path.normpath(targetfolder)))) #Note here maybe a problem, root/f must 
zipf.close()
    print " Process %s\tDONE" % inputs

def mp_handler():
    p = multiprocessing.Pool(2)
    p.map(mp_worker, data)

if __name__ == '__main__':
    mp_handler()

您可以参考 - Python Module of the Week

答案 1 :(得分:1)

我怀疑多处理在这方面会有所帮助。

Python stdlib中的zipfile模块不是线程安全的!!!

因此,我们应该如何优化您的代码?

在执行优化之前和之后始终进行配置文件。

因为我不知道你的文件结构。我以python源代码为例。

$ time python singleprocess.py
python singleprocess.py  2.31s user 0.22s system 100% cpu 2.525 total

然后,让我们试试Ubuntu附带的zip命令。(info-zip)。

您可以指定zip命令的压缩级别。 -1表示最快的压缩速度(压缩较少),-9表示最慢的压缩速度。默认压缩级别为-6。

$ time zip python.zip Python-2.7.6 -r -q
zip python.zip Python-2.7.6 -r -q  2.02s user 0.11s system 99% cpu 2.130 total

$ time zip python.zip Python-2.7.6 -r -q  -1
zip python.zip Python-2.7.6 -r -q -1  1.00s user 0.11s system 99% cpu 1.114 total

$ time zip python.zip Python-2.7.6 -r -q  -9
zip python.zip Python-2.7.6 -r -q -9  4.92s user 0.11s system 99% cpu 5.034 total

你知道,python的zlib模块的性能非常具有竞争力。但是有一些专业的zip工具可以让你更好地控制压缩策略。

您可以使用python中的子进程模块调用这些外部命令。

此外,当您使用上面的python代码压缩目录时,您将丢失目录及其子目录的元数据(权限位,上次访问时间,上次修改时间......)。