8.3.2 增量压缩和解压缩
内存中的压缩方法存在明显的缺点,对于实际用例并不实用。另一种方法是使用BZ2Compressor和BZ2Decompressor对象以增量方式处理数据,从而不必将整个数据集都放在内存中。
import bz2
import binascii
import io
compressor = bz2.BZ2Compressor()
with open('lorem.txt','rb') as input:
while True:
block = input.read(64)
if not block:
break
compressed = compressor.compress(block)
if compressed:
print('Compressed:{}'.format(
binascii.hexlify(compressed)))
else:
print('buffering...')
remaining = compressor.flush()
print('Flushed:{}'.format(binascii.hexlify(remaining)))
这个例子从一个纯文本文件读取小数据块,并将它传至compress()。压缩器维护压缩数据的一个内部缓冲区。由于压缩算法取决于校验和以及最小块大小,所以压缩器每次接收更多输入时可能并没有准备好返回数据。如果它没有准备好一个完整的压缩块,则会返回一个空串。所有数据都已经输入时,flush()方法会强制压缩器结束最后一个数据块,并返回余下的压缩数据。
运行结果: