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

问题描述 投票:1回答:1

我遇到了一个问题,就是我在从S3中使用 iter_chunks() 方法从 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
# ...

这段代码最初打印出的是 65505 之后的每一次迭代都以0跟随。我的理解是,这段代码应该解压每个压缩块,然后打印未压缩版本的长度。

我是否遗漏了什么?

python amazon-s3 gzip boto3 zlib
1个回答
1
投票

似乎你的输入文件是块状的gzip(bgzip)。http:/www.htslib.orgdocbgzip.html )因为你有一个65k的数据块被解码。

GZip文件可以被连接在一起 ( 见 https:/www.gnu.orgsoftwaregzipmanualgzip.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
© www.soinside.com 2019 - 2024. All rights reserved.