В чем разница между инкрементным и одноразовым сжатием?

Я пытаюсь использовать пакеты bz2 и/или lzma в python. Я пытаюсь сжать дамп базы данных в формате csv, а затем поместить его в файл zip. Я заставил его работать с однократным сжатием с обоими пакетами.

Код для которого выглядит так:

with ZipFile('something.zip', 'w') as zf:
    content = bz2.compress(bytes(csv_string, 'UTF-8'))  # also with lzma
    zf.writestr(
        'something.csv' + '.bz2',
        content,
        compress_type=ZIP_DEFLATED
    )

Когда я пытаюсь использовать добавочное сжатие, он создает файл .zip, который, когда я пытаюсь извлечь, продолжает рекурсивно выдавать какой-то архивный файл.

Код для которого выглядит так:

with ZipFile('something.zip', 'w') as zf:
    compressor = bz2.BZ2Compressor()
    content = compressor.compress(bytes(csv_string, 'UTF-8'))  # also with lzma
    zf.writestr(
        'something.csv' + '.bz2',
        content,
        compress_type=ZIP_DEFLATED
    )
    compressor.flush()

Я просмотрел документацию, а также искал информацию о методах сжатия, и, кажется, нет исчерпывающей информации о том, что такое одноразовое и инкрементное сжатие.


person adarsh    schedule 25.03.2015    source источник
comment
Вы можете прочитать tukaani.org/lzma/benchmarks.html и arxiv.org/abs/1008.0452 и en.wikipedia.org/wiki/Incremental_encoding   -  person Tui Popenoe    schedule 25.03.2015
comment
Спасибо! Что помогает. Однократное сжатие немного сложно для быстрого понимания.   -  person adarsh    schedule 25.03.2015
comment
Вы тратите лишнее время на попытки дважды сжать файл .bz2.   -  person Antti Haapala    schedule 25.03.2015
comment
Я озадачен. Ваш второй пример приведет к повреждению something.csv.bz2, но не вызовет ошибок с самим zip-файлом. Он должен распаковываться без проблем. Кстати, если вы хотите сохранить файл bz2 в zip-файле, используйте ZIP_STORED. Фактически вы увеличиваете размер архива, если пытаетесь сжать его дважды.   -  person tdelaney    schedule 25.03.2015
comment
@adarsh ​​ты уже нашел решение? каковы ваши результаты   -  person The Beast    schedule 23.02.2016


Ответы (1)


Разница между однократным и инкрементным режимом заключается в том, что в однократном режиме вам необходимо иметь все данные в памяти; если вы сжимаете файл размером 100 гигабайт, у вас должно быть много оперативной памяти.

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


Ваш второй код неверен и приведет к потере ваших данных. flush может вернуть больше данных, которые вам также необходимо сохранить. Здесь я сжимаю строку из 1000 'a' символов в Python 3; результатом compress является пустая строка; фактические сжатые данные возвращаются из flush.

>>> c = bz2.BZ2Compressor()
>>> c.compress(b'a' * 1000)
b''
>>> c.flush()
b'BZh91AY&SYI\xdcOc\x00\x00\x01\x81\x01\xa0\x00\x00\x80\x00\x08 \x00 
\xaamA\x98\xba\x83\xc5\xdc\x91N\x14$\x12w\x13\xd8\xc0'

Таким образом, ваш второй код должен быть:

compressor = bz2.BZ2Compressor()
content = compressor.compress(bytes(csv_string, 'UTF-8'))  # also with lzma
content += compressor.flush()    

Но на самом деле вы все еще выполняете одноразовое сжатие очень сложным способом.

person Antti Haapala    schedule 25.03.2015
comment
Ах, здорово! Спасибо! Это полностью проясняет это для меня. Хотя я хочу спросить, как я могу сделать это менее сложным образом? Что сложного в моем одноразовом подходе? Также есть ли какое-либо преимущество сжатия при использовании одного из подходов по сравнению с другим, исходя из того, что объяснено здесь en.wikipedia.org/wiki/Incremental_encoding? - person adarsh; 25.03.2015
comment
Нет, я имею в виду, что вы используете инкрементный энкодер для однократного - person Antti Haapala; 25.03.2015
comment
@AnttiHaapala я все еще ищу способ выполнить добавочную декомпрессию с помощью LZMA SDK 7-zip.org /sdk.html! Можете ли вы помочь, пожалуйста - person The Beast; 23.02.2016
comment
@Frankenstein, если у вас есть еще вопрос, задайте еще вопрос. - person Antti Haapala; 23.02.2016
comment
@AnttiHaapala на самом деле вот вопрос stackoverflow.com/questions/35249031/ - person The Beast; 23.02.2016