【问题标题】:Ungzipping chunks of bytes from from S3 using iter_chunks()使用 iter_chunks() 从 S3 解压缩字节块
【发布时间】:2020-04-05 19:51:50
【问题描述】:

我在使用boto3iter_chunks() 方法从S3 读取的字节块解压缩时遇到问题。逐块解压文件的策略源自this issue

代码如下:

dec = zlib.decompressobj(32 + zlib.MAX_WBITS)
for chunk in app.s3_client.get_object(Bucket=bucket, Key=key)["Body"].iter_chunks(2 ** 19):
    data = dec.decompress(chunk)
    print(len(chunk), len(data))

# 524288 65505
# 524288 0
# 524288 0
# ...

此代码最初打印出65505 的值,随后为每次后续迭代打印 0。我的理解是这段代码应该解压缩每个压缩的块,然后打印未压缩版本的长度。

我有什么遗漏吗?

【问题讨论】:

  • 你能确认压缩块的长度不是零吗?即print(len(chunk), len(data)) 并澄清它是 gzip 还是 zlib ?

标签: python amazon-s3 gzip boto3 zlib


【解决方案1】:

您的输入文件似乎是块 gzip (bgzip http://www.htslib.org/doc/bgzip.html),因为您解码了 65k 块数据。

GZip 文件可以连接在一起(请参阅https://www.gnu.org/software/gzip/manual/gzip.html#Advanced-usage),Block GZip 使用它来连接同一文件的块,因此通过使用关联索引,只需解码包含感兴趣信息的特定块。

因此,要对块 gzip 文件进行流式解码,您需要使用一个块中的剩余数据来开始一个新的块。例如

# source is a block gzip file see http://www.htslib.org/doc/bgzip.html
dec = zlib.decompressobj(32+zlib.MAX_WBITS)
for chunk in raw:
    # decompress this chunk of data
    data = dec.decompress(chunk)
    # bgzip is a concatenation of gzip files
    # if there is stuff in this chunk beyond the current block
    # it needs to be processed
    while len(dec.unused_data):
        # end of one block
        leftovers = dec.unused_data
        # create a new decompressor
        dec = zlib.decompressobj(32+zlib.MAX_WBITS)
        #decompress the leftovers
        data = data+dec.decompress(leftovers)
    # TODO handle data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多