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

时间:2018-03-02 16:27:37

标签: python compression

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

为什么bz2如此缓慢的原因:

通过bz2 -d解压缩该文件:104seconds

解压缩文件上的分析(只涉及逐行阅读):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:

2 个答案:

答案 0 :(得分:2)

您可以使用提供透明文件类句柄的git checkout对象。

(编辑:您似乎已经使用过,但不要在二进制文件或文本文件上使用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)

答案 1 :(得分:0)

对于在保存到文件之前可以存储在内存中的较小文件,可以使用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()