【问题标题】:Python BZ2 Compressor - compress() not returning anythingPython BZ2 Compressor - compress() 不返回任何内容
【发布时间】:2011-11-23 17:48:11
【问题描述】:

我正在尝试使用 pythons bz2compressor 类压缩数据流。

文档说bz2compressor.compress() 应该“尽可能”返回压缩数据块,但我什么也没得到

当我flush()(我尝试过使用 2GB 以上的文件)时,我得到了所有的压缩数据。

有没有办法可以将任何内部缓冲区限制设置为何时返回数据。

谢谢!

【问题讨论】:

  • “当我刷新()时,我得到了所有的压缩数据(我已经尝试了 2GB+ 的文件)仍然没有。”?这是什么意思?你用flush获取数据吗?如果是这样,那么你的问题是什么?你想知道为什么它似乎并没有真正返回块吗?
  • 嗨,是的,我想要来自 bz2compressor.compress() 的小块(文档说这个函数应该返回夹头)
  • 返回块不是必需的。看来,实现不需要。看来你的电脑内存太大了。
  • 我知道它不是 必需的 因此问题:有没有办法可以强制它返回块 - 也许刷新内部缓冲区.. 类似的东西

标签: python stream buffer compression bzip2


【解决方案1】:

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

当我使用真正随机的数据时,我会得到块。

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多