我使用bz2
库在内存中解压缩和读取文件。但是,我已经阅读了文档,似乎只是简单地解压缩文件,在文件系统上创建一个带有解压缩数据而没有内存存储的全新文件。当然,您可以使用BZ2Decompressor逐行读取,然后将其写入文件,但这将非常慢。 (解压缩大量文件,50GB +)。是否有一些我忽略的方法或库来实现与python中的终端命令bz2 -d myfile.ext.bz2
相同的功能而不使用涉及子进程调用该终端命令的hacky解决方案?
bz2如此慢的原因示例:
通过bz2 -d解压缩该文件:104秒
解压缩文件上的分析(只涉及逐行读取):183秒
with open(file_src) as x:
for l in x:
解压缩文件并使用分析:超过600秒(此时间最长应为104 + 183)
if file_src.endswith(".bz2"):
bz_file = bz2.BZ2File(file_src)
for l in bz_file:
您可以使用bz2.BZ2File
对象,该对象提供透明的文件类句柄。
(编辑:你似乎已经使用了它,但是不要在二进制文件或文本文件上使用readlines()
,因为在你的情况下,块大小不够大,这解释了为什么它很慢)
然后使用shutil.copyfileobj
复制到输出文件的写入句柄(如果可以负担内存,则可以调整块大小)
import bz2,shutil
with bz2.BZ2File("file.bz2") as fr, open("output.bin","wb") as fw:
shutil.copyfileobj(fr,fw)
即使文件很大,它也不需要比块大小更多的内存。像这样调整块大小:
shutil.copyfileobj(fr,fw,length = 1000000) # read by 1MB chunks