【问题标题】:Possible to decompress bz2 in python to a file instead of memory可以将python中的bz2解压缩到文件而不是内存
【发布时间】:2018-03-02 16:27:36
【问题描述】:

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

【问题讨论】:

    标签: python compression


    【解决方案1】:

    您可以使用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 文件以及为什么它在我的测试中这么慢
    • 很好的解决方案。甚至击败bz2 -d 非常感谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多