使用iter_chunks()从S3解压缩字节块

时间:2020-04-05 19:51:50

标签: python amazon-s3 gzip boto3 zlib

我遇到的问题是使用iter_chunks()的{​​{1}}方法解压缩我正在从S3读取的字节块。逐块解压缩文件的策略起源于this issue

代码如下:

boto3

此代码最初打印出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 # ... 的值,随后打印出每个后续迭代的0。我的理解是,这段代码应该解压缩每个压缩的块,然后打印未压缩版本的长度。

有什么我想念的吗?

1 个答案:

答案 0 :(得分: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