Как мы можем оценить "издержки" сжатого файла?
Предположим, мы сжимаем, например, файл .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
издержки байтов