Python BZ2 Compressor - compress () ничего не возвращает - PullRequest
2 голосов
/ 23 ноября 2011

Я пытаюсь сжать поток данных с помощью класса pythons bz2compressor.

В документации сказано, что bz2compressor.compress() должен возвращать фрагменты сжатых данных "когда это возможно", но я ничего не получаю

Я получаю ВСЕ сжатые данные, когда я flush() (я пыталсяс файлами 2GB +) все еще ничего.

Есть ли способ, которым я могу установить любое ограничение внутреннего буфера, когда он должен возвращать мне данные.

Спасибо!

1 Ответ

3 голосов
/ 07 декабря 2011

Я получаю ВСЕ свои сжатые данные, когда очищаю () (я пробовал с файлами 2 ГБ +), по-прежнему ничего.

Есть хитрость в работе с компрессорами.

Держу пари, что ваш файл объемом 2 ГБ + был не очень случайным.Случайные данные плохо сжимаются.Упорядоченные данные сжимаются до очень небольшого размера.

Например,

>>> 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

Я получаю куски, когда использую действительно случайные данные.

...