可以将 python 中的 bz2 解压缩到文件而不是内存中



我已经使用bz2库在内存中动态解压缩和读取文件。 但是,我已经通读了文档,似乎不能简单地解压缩文件以在文件系统上创建一个全新的文件,其中包含解压缩的数据,而无需内存存储。 当然,您可以使用BZ2Decompressor逐行读取,然后将其写入文件,但那会非常慢。(解压缩海量文件,50GB+(。 是否有一些我忽略的方法或库来实现与 python 中的终端命令bz2 -d myfile.ext.bz2相同的功能,而无需使用涉及子进程的黑客解决方案来调用该终端命令?

示例为什么 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

对于在保存到文件之前可以存储在内存中的较小文件,可以使用bz2.open解压缩文件并将其另存为未压缩的新文件。

import bz2
#decompress data
with bz2.open('compressed_file.bz2', 'rb') as f:
    uncompressed_content = f.read()
#store decompressed file
with open('new_uncompressed_file.dat', 'wb') as f:
   f.write(uncompressed_content)
   f.close()

最新更新