首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用iter_chunks()从S3解压字节块

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

Stack Overflow用户
提问于 2020-04-06 03:51:50
回答 1查看 743关注 0票数 1

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

代码如下:

代码语言:javascript
复制
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。我的理解是,这段代码应该对每个压缩后的块进行ungzip,然后打印出未压缩版本的长度。

我是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-20 17:50:16

看起来你的输入文件是块gzip (bgzip http://www.htslib.org/doc/bgzip.html ),因为你有一个65k的数据块解码。

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

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

代码语言:javascript
复制
# 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61048597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档