Python BZ2 压缩器 - compress() 没有返回任何内容
我正在尝试使用Python的bz2compressor类来压缩一个数据流。
文档上说,bz2compressor.compress()
应该在“可能的情况下”返回压缩数据的块,但我什么都没有得到。
我只有在调用flush()
时才得到所有的压缩数据(我尝试过的文件都超过2GB),还是没有任何返回。
有没有办法设置内部缓冲区的限制,让它在什么时候返回数据给我呢?
谢谢!
1 个回答
3
我在调用flush()的时候能得到我所有的压缩数据(我试过2GB以上的文件),但还是没有效果。
处理压缩工具有个小窍门。
我敢打赌,你那个2GB以上的文件其实不太随机。随机的数据压缩效果不好,而有规律的数据压缩后能变得非常小。
举个例子:
>>> import bz2
>>> c=bz2.BZ2Compressor()
>>> import string
>>> data = string.printable*1024
>>> len(data)
102400
>>> c.compress(data)
''
>>> result= c.flush()
>>> len(result)
361
提供的数据有一定的规律,这让它压缩得很好。
你需要的是随机数据。
>>> import random
>>> c=bz2.BZ2Compressor()
>>> size= 0
>>> result= ''
>>> while result == '':
... data = ''.join( random.choice(string.printable) for i in xrange(1024*8) )
... size += len(data)
... result= c.compress(data)...
>>> len(result)
754809
>>> size
901120
当我使用真正随机的数据时,我能得到一些数据块。