You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python的BZ2解压缩器会使数据块体积变小?

为什么BZ2解压后数据块反而“变小”?

这不是真的解压后数据变小了,问题出在bz2.BZ2Decompressor的工作机制和你读取数据的方式上:

1. BZ2Decompressor的缓冲特性

BZ2Decompressor不会一次性处理所有输入数据并输出全部解压结果——它内部会维护一个缓冲区,当输入数据不足以完成一个完整的压缩块解码时,未处理的字节会被暂存起来,只输出当前能解码出的部分。你只调用了一次decompress(),所以只得到了当前可解码的2560字节,剩下的未处理数据还在解码器的缓冲区里,没有输出。

2. 维基百科多流压缩文件的结构

你使用的是维基百科的多流(multistream)转储文件,这类文件由多个独立的BZ2压缩块拼接而成,每个块都有自己的压缩头部。你读取的10000字节可能只包含第一个压缩块的头部和部分数据,解码器处理完这部分中可解码的内容后,剩下的字节因为无法组成完整的解码单元,就被缓冲起来了。

验证方法:完整处理文件

如果要看到真实的压缩比,应该用同一个解码器实例持续处理整个文件,累加解压后的总长度:

import bz2

total_compressed = 0
total_decompressed = 0

with open('enwiki-20231020-pages-articles-multistream1.xml-p1p41242.bz2', 'rb') as f:
    decompressor = bz2.BZ2Decompressor()
    while True:
        block = f.read(10000)
        if not block:
            break
        total_compressed += len(block)
        try:
            decompressed_data = decompressor.decompress(block)
            total_decompressed += len(decompressed_data)
        except EOFError:
            break

print(f"总压缩字节数: {total_compressed}")
print(f"总解压字节数: {total_decompressed}")

运行这段代码后,你会发现总解压字节数远大于压缩字节数,符合BZ2无损压缩的预期——整体上解压后数据是变大的,只是单次块处理时因为解码器缓冲,只输出了部分结果。

内容的提问来源于stack exchange,提问作者Rapid Readers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:30:10