Могут ли tar-файлы улучшить сжатие?

9

Может ли объединение нескольких файлов улучшить сжатие стандартными инструментами, например, gzip, bzip2, xz?

Я долго думал, что это так, но никогда не проверял. Если у нас есть 2 копии одного и того же файла размером 20 МБ, взятых вместе, случайная байта, умная программа сжатия, которая понимает, что это может сжать весь архив до почти 20 МБ.

Я только что попробовал этот эксперимент, используя gzip, bzip2 и xz для сжатия 1) файла случайных байтов, 2) архива из двух копий этого файла и 3) кота из двух копий этого файла. Во всех случаях сжатие не уменьшало размер файла. Это ожидается для случая 1, но для случаев 2 и 3 оптимальный результат заключается в том, что файл размером 40 МБ можно сжать до почти 20 МБ. Это трудно понять программе сжатия, особенно потому, что избыточность удалена, поэтому я не ожидал бы идеального результата, но я все еще думал, что будет некоторое сжатие.

Тестовое задание:

dd if=/dev/urandom of=random1.txt bs=1M count=20
cp random1.txt random2.txt
cat random1.txt random2.txt > random_cat.txt
tar -cf randoms.tar random1.txt random2.txt
gzip -k random* &
bzip2 -k random* &
xz -k random* &
wait
du -sh random*

Результат:

20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.40937 s, 14.9 MB/s
[1]   Done                    gzip -k random*
[2]-  Done                    bzip2 -k random*
[3]+  Done                    xz -k random*
20M random1.txt
21M random1.txt.bz2
21M random1.txt.gz
21M random1.txt.xz
20M random2.txt
21M random2.txt.bz2
21M random2.txt.gz
21M random2.txt.xz
40M random_cat.txt
41M random_cat.txt.bz2
41M random_cat.txt.gz
41M random_cat.txt.xz
41M randoms.tar
41M randoms.tar.bz2
41M randoms.tar.gz
41M randoms.tar.xz

Это вообще то, что я должен ожидать?

Есть ли способ улучшить сжатие здесь?

Praxeolitic
источник
Ваши тесты являются плохими примерами. Попробуйте выполнить тест, скажем, с каталогом из ~ 100 (реальных) текстовых файлов.
lcd047
Почему это плохой пример? Мы точно знаем, чего ожидать. Случайный файл не может быть сжат, и 2 случайных файла могут быть сжаты пополам.
Praxeolitic
«Случайное» содержимое файла является проблемой. Они несжимаемы. Используйте два разных больших текстовых файла, чтобы получить лучшее представление. Родственная идея здесь - «нормализованная разница сжатия». Вы можете взглянуть на ims.cuhk.edu.hk/~cis/2005.4/01.pdf, чтобы увидеть, с какими проблемами вы можете столкнуться при проведении такого рода тестирования.
Брюс Эдигер

Ответы:

11

Вы против "размера блока" компрессора. Большинство программ сжатия разбивают ввод на блоки и сжимают каждый блок. Похоже, что размер блока bzip увеличивается только до 900 КБ, поэтому он не увидит ни одного паттерна, который повторяется дольше, чем 900 КБ.

http://www.bzip.org/1.0.3/html/memory-management.html

Похоже, что gzip использует блоки 32K.

С хз тебе везет хоть! Со страницы руководства:

   Preset   DictSize   CompCPU   CompMem   DecMem
     -0     256 KiB       0        3 MiB    1 MiB
     -1       1 MiB       1        9 MiB    2 MiB
     -2       2 MiB       2       17 MiB    3 MiB
     -3       4 MiB       3       32 MiB    5 MiB
     -4       4 MiB       4       48 MiB    5 MiB
     -5       8 MiB       5       94 MiB    9 MiB
     -6       8 MiB       6       94 MiB    9 MiB
     -7      16 MiB       6      186 MiB   17 MiB
     -8      32 MiB       6      370 MiB   33 MiB
     -9      64 MiB       6      674 MiB   65 MiB

таким образом, «xz-8» найдет до 32 МБ шаблонов, а «xz -9» - до 64 МБ. Но будьте осторожны, сколько оперативной памяти требуется, чтобы выполнить сжатие (и распаковать) ...

без данных
источник
1
Да, xz -8 действительно сжимает тарбол и кота в тесте до 21M.
Праксеолит
1
Это больше, чем просто размер блока. Но полная история - это не то, что можно объяснить в нескольких параграфах по SE.
lcd047
1
@Praxeolitic Может помочь курс по сжатию данных.
lcd047
1
@ lcd047 Сжатие - огромная тема, но вопрос здесь был просто «почему это сжатие не было», и ответ заключается в том, что сжатие работает на повторяющихся шаблонах, и шаблон, который он хотел найти, потребовал больше времени для повторения, чем любой инструмент.
без данных
1
Я также думаю, что полезно знать, что «-9» в большинстве компрессоров командной строки означает не «стараться найти шаблоны», а «учитывает большие пространства шаблонов».
без данных
2

Случайное содержимое файла вы выбрали не является хорошим пример - прессованное tarfiles будет больше , чем оригиналы. То же самое вы увидите с файлами в уже сжатых форматах (например, во многих форматах изображений / аудио / видео).

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

Дэн Корнилеску
источник
@kos Это зависит от используемого алгоритма и данных. Указанные 33% для очень особого случая. С помощью gzip и bzip2 я измерил 1000 случайно сгенерированных файлов размером 1 МБ, то есть увеличение <1% на каждый файл.
Джофель
2

Как уже указывалось:

  1. Использование случайных файлов не годится, так как они уже содержат максимальную «информационную энтропию», поэтому не будут сжиматься;
  2. Вам нужно упаковать много файлов для честного сравнения.

Лучший тестовый пример может быть таким:

cd /var/tmp
tar -zcf test1.tar /usr
tar -cf test2.tar /usr
gzip test2.tar
ls -h

(Примечание: в надежде, что под ними нет креплений /usr!)

Вы можете использовать tar -jcfдля сжатия XZ вместо.

Теперь, если test2.tar.gzон меньше, чем test1.tar.gz, тогда тест пройден успешно (т. Е. Сжатые файлы тогда сжимают лучше, чем сжатие, чем tarring). Я предполагаю, что это будет для многих (то есть тысяч) файлов. Недостатком является то, что это может занять больше времени для выполнения, а также потребует намного больше дискового пространства, поскольку сначала нужно собрать весь файл tar, а затем сжать его. Вот почему часто используется 1-й метод, так как он сжимает каждый файл на лету, даже если он не дает такого маленького тарбола.

Например, в нашей автономной резервной копии мы обычно создаем резервные копии 4 000 000 файлов общим объемом около 2 ТБ. Таким образом, первый способ намного быстрее и не требует дополнительных 2 ТБ диска.

quazza
источник
Не -zсжимает архив (то есть tar)? Обычно имя выходного файла czfзаканчивается на .tar.gz, чтобы подчеркнуть это.
Яри ​​Кейнянен