繁体   English   中英

在Python中从内存解压缩流式BZ2

[英]Decompress streaming BZ2 from memory in Python

我的内存中有一块CSV数据bz2压缩数据

compressed = load_from_network_service(...)

我想遍历一连串的解压线。

for line in bz2_decompress_stream(compressed):
    ...

是否存在这样的功能?

原则上,我可以写到磁盘,然后使用bz2.BZ2Filebz2.BZ2File ,这似乎只想使用文件名

with open('tmp', 'w') as f: 
    f.write(compressed)
with bz2.BZ2File('tmp') as f:
    for line in f:
        ...

但是,对于我当前的应用程序磁盘I / O来说非常重要,所以这很痛苦。

大概bz2.BZ2Decompressor对象在这里可能会有所帮助。 我的经验是,我给它压缩的数据,并给了我整个解压缩的结果。 它似乎没有流。 也许这是我数据的限制?

有两个不同的问题:

  1. 流媒体
  2. 不写入磁盘

为了解决2.,您可以使用bz2.BZ2Compressor 但是1 .....的解决方案完全取决于您的第一行

compressed = load_from_network_service(...)

真的回来了。 如果compressed是一个字符串,那么您将无能为力:您必须等到全部检索到之后再解压缩。 相反,例如,如果它是一个增量“填充”的StringIO ,则可以执行以下操作(未测试):

decompressed = ''
while True:
    compressed_chunk = compressed.read(100)
    # Can be empty (even before the stream is exhausted):
    decompressed_chunk = decompressor.decompress(data)
    if decompressed_chunk:
        decompressed += decompressed_chunk
        new_lines = decompressed.splitlines()
        decompressed = new_lines[-1]
        for line in new_lines[:-1]:
            do_something(line)
    if len(chunk) < 100:
        # Reached EOF
        break

暂无
暂无

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

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