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

标签 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)来优化此循环的方法。

感谢您的建议。

最佳答案

我怀疑多重处理在这里会有帮助。

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 代码来压缩目录时,您将丢失该目录及其子目录的元数据(权限位、上次访问时间、上次修改时间...)。

关于python - 如何使用python多重处理优化压缩文件功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22851957/

相关文章:

python - Pyramid 烧杯访问已创建的 session

python - imshow() 函数显示空的灰色图像。我该怎么办?

python - 在 Python 中结束评论

android - 如何停止/启动包含创建无限循环的服务

javascript - 无需安装浏览器的 Python Scraping JavaScript 页面

java - JRuby:如果运行时间太长,请关闭 runScriptlet?

c# - 从线程中的 GUI 对象检索属性

java - 使用 Java 解压并重新打包 jar 会导致 jar 文件损坏

java - 如何将二进制数据转换为 Zip 文件?

c++ - 在 Redhat : alternatives to system() 上从 C++ 解压缩文件