Я читал, что иногда такие файлы, как .mp3 или сжатые изображения не стоит сжимать (например, с помощью zlib), потому что они уже сжаты и тратят больше ресурсов процессора, чем экономят место. Существуют ли какие-либо рекомендуемые библиотеки, которые могут определить, стоит ли сжимать файл перед передачей?
2 ответа
Сжатие в целом работает путем удаления избыточных конструкций из потока данных обратимым образом.
Одной из мер, которую вы можете использовать для определения того, какая часть даты может считаться избыточной, является автокорреляция, где чем она меньше, тем меньше сигнал будет сжимаемым (исключения существуют в зависимости от используемого алгоритма).
Однако алгоритм низшей последовательности для определения автокорреляции имеет порядок O(n*log(n))
. Я полагаю, что большинство алгоритмов сжатия имеют порядок O(n)
что делает его бесполезным запускать его на очень длинных файлах. (было бы эффективнее просто попытаться сжать и проверить размеры файлов)
В StoreBackup вы можете определить правила. Правило может быть комбинацией различных проверок, например. в зависимости от суффикса файла. Но есть также специальная функция COMPRESSION_CHECK, которая решает, в зависимости от содержимого файла. Нет смысла проверять каждый файл с помощью COMPRESSION_CHECK, поэтому вы можете определить, например. следующие:
- все файлы с расширением .jpg и .mp3 не сжимаются без каких-либо дополнительных проверок
- все файлы, заканчивающиеся на .doc и .pdf, сжимаются во всех случаях без каких-либо дополнительных проверок
- все файлы размером менее 1 КБ не сжимаются без каких-либо дополнительных проверок
- все остальные файлы проверяются функцией COMPRESSION_CHECK
Это поведение описано в указанном документе.
(Вы можете, например, также определить правила, которые дополнительно никогда не сжимают файлы от отдельного человека или группы для более легкого восстановления с помощью файлового браузера, но это не связано с вашими вопросами)