为何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
相关产品推荐
相关产品推荐

