更改 gzip 文件头的最快方法?
Fastest way to change head of a gzip file?
我维护一个基准库,其中包含 gz 压缩文件,前几行包含描述性元数据。我可以手动解压一个 246MB 的 gz 压缩文件(使用 gunzip),更改它,然后使用 linux 终端在 2 分钟内将其压缩回来(使用 gzip)。在同一个文件上,以下脚本需要将近 5 分钟才能完成(使用 Python 2.7.5)和 12 分钟以上(使用 Python 3.4.1),然后我才将其杀死。
import os, gzip, shutil
def renew_file(file, tempfile):
f = gzip.open(file,'r')
try:
# Read and modify first line(s)
buf = f.readline()
buf = 'changing first line\n'
# Write change to temporary file
f2 = gzip.open(tempfile,'w')
try:
f2.write(buf)
shutil.copyfileobj(f,f2)
finally:
f2.close()
finally:
f.close()
# Overwrite file
os.rename(tempfile, file)
关于如何实现更高性能有什么建议吗?
命令行上的 Gzip defaults to a compression level of 6. Python, however, defaults to a compression level of 9,速度较慢但生成的文件较小。如果你想尽快获得更大的文件,你可以将 compresslevel=6
传递给 gzip.open()
,如果你稍后想要较小的文件,你可以将 -9
传递给 gzip
。
我维护一个基准库,其中包含 gz 压缩文件,前几行包含描述性元数据。我可以手动解压一个 246MB 的 gz 压缩文件(使用 gunzip),更改它,然后使用 linux 终端在 2 分钟内将其压缩回来(使用 gzip)。在同一个文件上,以下脚本需要将近 5 分钟才能完成(使用 Python 2.7.5)和 12 分钟以上(使用 Python 3.4.1),然后我才将其杀死。
import os, gzip, shutil
def renew_file(file, tempfile):
f = gzip.open(file,'r')
try:
# Read and modify first line(s)
buf = f.readline()
buf = 'changing first line\n'
# Write change to temporary file
f2 = gzip.open(tempfile,'w')
try:
f2.write(buf)
shutil.copyfileobj(f,f2)
finally:
f2.close()
finally:
f.close()
# Overwrite file
os.rename(tempfile, file)
关于如何实现更高性能有什么建议吗?
命令行上的 Gzip defaults to a compression level of 6. Python, however, defaults to a compression level of 9,速度较慢但生成的文件较小。如果你想尽快获得更大的文件,你可以将 compresslevel=6
传递给 gzip.open()
,如果你稍后想要较小的文件,你可以将 -9
传递给 gzip
。