#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-файлов» — проблема в том, что файлы журналов не будут распакованы, когда пользователи нажимают на них. Пользователь получит сжатый большой двоичный объект вместо текста. Быстро это или нет, даже не имеет значения.