У меня около 700 исходных файлов Python (.py
) размером в несколько килобайт (средний размер файла - 12 кБ, но также есть много файлов по 1 кБ), и я хотел бы создать сжатый архивсодержащий все из них.Мои требования:
- Архив должен быть небольшим.(
.zip
файлы дают мне коэффициент сжатия 3,816, мне нужно что-то меньшее. Файл .rar
, созданный с помощью rar -s -m5 a
, дает мне коэффициент сжатия 6,177, я бы предпочел 7 или больше.) - Сжатие должно быть без потерь, оно должно сохранять исходный файл побитно.(Таким образом, минификация отсутствует.)
- Должна быть небольшая библиотека, написанная на C, которая может перечислять архив и извлекать отдельные файлы.
- Библиотека декомпрессии должна быть быстрой, то есть не намного медленнее, чем
zlib
, желательно быстрее. - Если я хочу извлечь один файл, мне не нужно распаковывать большие несвязанные части архива.(Таким образом, сжатые файлы
.tar
отсутствуют, а файлы .rar
отсутствуют.) - Поскольку все файлы
.py
имеют небольшой размер (всего несколько килобайт), мне не нужна потоковая передачараспаковка или поиск поддержки в файле. - Если возможно, распаковка должна быть инициализирована из контекстного словаря, сгенерированного из объединения файлов
.py
, чтобы сэкономить больше места.
Какой алгоритм сжатия и библиотеку декомпрессии C вы порекомендуете?
Я знаю о концепции минимизации кода (например, удаление комментариев и лишних пробелов, переименование локальных переменных в одну букву), и я рассмотрю возможность использования этого метода длянекоторые из моих .py
файлов, но в этом вопросе меня это не интересует.(См. Python minifier здесь .)
Я знаю о концепции компиляции байт-кода (.pyc
файлы), но в этом вопросе меня это не интересует.(Причина, по которой я не хочу иметь байт-код в архиве, заключается в том, что байт-код зависит от архитектуры и версии, поэтому он менее переносим. Кроме того, .pyc
файлы, как правило, немного больше, чем уменьшенные .py
файлы.)
См. Мои ответы, содержащие план B и план C. Я все еще ищу план A, который меньше, чем ZIP (но, скорее всего, он будет больше, чем .tar.xz
), и у него меньше накладные расходы, чем .tar.xz
.