Как сохранить уже сжатые данные в ZIP-формате?

#python #zipfile

#python #zip

Вопрос:

У меня есть программа, которая собирает журналы с множества компьютеров (через Paramiko) и сжимает их в один ZIP-файл. (Используется ZIP-формат, несмотря на то, что он не так экономичен, потому что он может быть «открыт» неискушенными пользователями с помощью простого «Проводника Windows».)

Машин много, а журналы (иногда) довольно большие, поэтому собирающая машина становится узким местом, сжимающим их. Даже если я распараллелю сжатие на стороне сбора, это все равно будет узким местом, потому что количество серверов (намного) больше, чем количество ядер, которые у меня есть.

Поэтому, естественно, я бы хотел, чтобы серверы сами выполняли сжатие перед отправкой, а затем просто архивировали полученные от них данные. (Сетевые передачи также будут ускорены.)

Как я могу сообщить zipfile.writestr() , что данные, предоставленные ему, уже сжаты?

Если нет zipfile , возможно, какой-то другой модуль может это сделать?

Комментарии:

1. используйте аргумент compression=zipfile.ZIP_STORED ключевого слова, чтобы указать, что файл должен быть просто заархивирован без дальнейшего сжатия. дальнейшее сжатие ничего не повредит, но, скорее всего, не приведет к значительной экономии и потребует дополнительных вычислений (вы должны выполнить тесты в обоих направлениях, чтобы увидеть, незначительно ли это).

2. Это приведет к тому, что данные также не будут сжаты при извлечении… И, да, сжатие уже сжатых данных является расточительным — это очевидно без тестов.

3. Двойное сжатие может быть настолько быстрым, что вам не нужно беспокоиться об этом, я согласен, вам следует сравнить его. И если вы добавите уже сжатый файл, он не будет распакован при его извлечении, независимо от того, сжимаете вы его дважды или нет.

4. @MikhailT. да, это приведет к созданию zip-файла, полного zip-файлов… Это такая большая проблема? Это самое простое решение. Попытка объединить предварительно сжатые файлы будет непростой.

5. «zip-файл, полный zip-файлов» — проблема в том, что файлы журналов не будут распакованы, когда пользователи нажимают на них. Пользователь получит сжатый большой двоичный объект вместо текста. Быстро это или нет, даже не имеет значения.