Как мы можем оценить "издержки" сжатого файла?

Предположим, мы сжимаем, например, файл .txt размером 7 байт. После сжатия и преобразования в файл .zip его размер составит 190 байт.

Есть ли способ оценить или вычислить приблизительный размер "накладных расходов"?

Какой фактор влияет на размер накладных расходов?

Zlib вычисляет служебную нагрузку: они сказали: "... только расширение - это служебная нагрузка в пять байтов на блок 16 КБ (около 0,03%) плюс одноразовая служебная нагрузка в шесть байтов для всего потока".

Я просто разместил этот сайт, чтобы сказать, что можно оценить размер "накладных расходов".

Примечание. Накладные расходы представляют собой некоторое количество дополнительных данных, добавляемых в сжатую версию данных.

1 ответ

Решение

Из формата ZIP.

Предполагая, что существует только один центральный каталог, без комментариев и без дополнительных полей, накладные расходы должны быть аналогичны следующим. (Накладные расходы будут увеличиваться только при добавлении дополнительных метаданных.)

  • За файл (локальный заголовок файла) - 30+ длина (имя файла)
  • За файл (дескриптор данных) - 12 (до 16)
  • За файл (заголовок центрального каталога) - 46+len(имя файла)
  • За архив (EOCD) - 22

Так что накладные расходы, где afn средняя длина всех имен файлов, и f это количество файлов:

  f * ((30 + afn) + 12 + (46 * afn)) + 22
= f * (88 + 2 * afn) + 22

Это, конечно, делает ZIP очень плохим выбором для очень маленьких кусочков сжатых данных, где (файловая) структура или метаданные не требуются - с другой стороны, zlib- очень тонкая оболочка Deflate.

Для небольших полезных нагрузок плохая реализация Deflate может также привести к значительно большему "сжатому" размеру, такому как пресловутая реализация.NET.


Примеры:

  • Сохранение 1 файла с именем "hello world note.txt" (len = 20),

    = 1 * (88 + 2 * 20) + 22 = 150 издержки байтов

  • Хранение 100 файлов со средним именем из 14 букв,

    = 100 * (88 + 2 * 14) + 22 = 11622 издержки байтов

Другие вопросы по тегам