繁体   English   中英

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

[英]Possible to decompress bz2 in python to a file instead of memory

我曾使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM