17

У меня есть сотни похожих больших файлов (30 мегабайт каждый), которые я хочу сжать. Каждая пара файлов содержит 99% одинаковых данных (разница менее 1%), поэтому я ожидаю, что у меня будет архив не более 40-50 мегабайт.

Один файл может быть сжат от 30 МБ до 13-15 МБ (с xz -1 , gz -1 , bzip2 -1), но при сжатии двух или более файлов я хочу иметь архив размером 13-15MB + N*0.3MB где N - количество файлов.

При использовании tar (для создания сплошного архива) и xz -6 (для определения словаря сжатия больше одного файла - Обновить - этого было недостаточно!), У меня все еще остается архив с размером N*13MB .

Я думаю, что и gzip и bzip2 мне не помогут, потому что у них словарь меньше 1 МБ, а мой поток tar повторяется каждые 30 МБ.

Как мне заархивировать мою проблему в современном Linux, используя стандартные инструменты?

Можно ли настроить xz для быстрого сжатия, но использовать словарь размером более 30-60 МБ?

Обновление: сделал трюк с tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz . Не уверен в необходимости параметров mf=hc4 и --memory=2G ; но dict=128M устанавливает словарь достаточно большим (больше, чем один файл), а mode=fast делает процесс немного быстрее, чем -e .

3 ответа3

12

Учитывая ваши данные, я предполагаю, что вы убедились, что ваши файлы действительно содержат 99% общих данных с непрерывной (или почти непрерывной) разницей в них 1%.

Во-первых, вы должны использовать tar для создания одного архива с вашими файлами внутри. Для тестов я бы создал .tar с 10 файлами, размером 300 МБ.

Затем, используя xz, вы должны установить его так, чтобы словарь был больше, чем размер одного файла. Поскольку вы не говорите, если у вас есть ограничения памяти, я бы пошел с xz -9. Нет смысла не использовать всю доступную память.

Я бы также использовал предустановку --extreme, чтобы проверить, имеет ли это значение.

Размер словаря

В одной доступной мне документации - сайте - сказано, что размер словаря примерно равен использованию памяти декомпрессора. А параметр -1 означает 1 ДБ, -6 означает 10 МБ (или 8 МБ в другой части того же руководства). Вот почему вы не получаете никаких преимуществ, собирая эти файлы вместе. Использование -9 сделает декомпрессор (и, следовательно, словарь) 64 МБ, и я думаю, что это то, что вы хотели.

редактировать

Другая возможность будет использовать другой компрессор. Я бы пошел с 7zip, но сначала скопировал бы эти файлы, а затем 7zip.

В зависимости от содержимого ваших файлов, возможно, вы можете использовать 7zip с методом PPM-D (вместо LZMA или LZMA2, который используется по умолчанию и используется в xz)

Не хорошо: Zip (dict = 32 кБ), Bzip (dict = 900 кБ).

9

Если они действительно на 99% похожи, как вы говорите, вы сможете использовать bsdiff или аналогичный алгоритм для расчета различий между файлами. Является ли разница кумулятивной (т. Е. Каждый файл немного отличается от первого), или разница между любыми двумя файлами практически одинакова?

Если это не кумулятивно, вы должны быть в состоянии:

  • Возьмите любой произвольный файл в качестве "базового уровня"
  • Запустите bsdiff сравнивая базовый файл с каждым дополнительным файлом
  • Храните каждый diff как отдельный файл вместе с базовым файлом
  • Запустите компрессор, например, xz по результатам (базовая линия + различия).

Результат должен быть намного меньше, чем просто xz всего архива.

Затем вы можете "восстановить" исходные файлы, "применив" diff к базовой линии, чтобы получить остальные файлы.

4

Вы (I) можете использовать tar с некоторым архиватором, способным обнаруживать паттерны на большом расстоянии, например, rzip или lrzip (Readme). Оба используют обнаружение / дедупликацию дальнего радиуса действия, тогда rzip использует bzip2, а lrzip использует xz (lzma) / ZPAQ:

rzip - это программа сжатия, похожая по функциональности на gzip или bzip2, но способная использовать избыточность на больших расстояниях в файлах, что иногда позволяет rzip создавать гораздо лучшие коэффициенты сжатия, чем другие программы. ... Основным преимуществом rzip является то, что он имеет эффективный буфер истории 900 Мбайт. Это означает, что он может найти совпадающие фрагменты входного файла на огромных расстояниях по сравнению с другими обычно используемыми программами сжатия. Для сравнения, программа gzip использует буфер истории 32 кбайт, а bzip2 использует буфер истории 900 кбайт

lrzip имеет больший буфер и может использовать многие алгоритмы сжатия (очень быстрый, быстрый, хороший и один из лучших - ZPAQ) после дедупликации:

Lrzip использует расширенную версию rzip, которая в первом проходе уменьшает избыточность на большие расстояния. Модификации lrzip позволяют масштабировать его в соответствии с объемом памяти.

Данные тогда либо:1. Сжатый lzma (по умолчанию), который дает отличное сжатие примерно в два раза быстрее, чем bzip2 сжатия ...

Другой способ - использовать программу резервного копирования bup с дедупликацией на уровне блоков / сегментов, основанную на git packfile:

Он использует алгоритм скользящей контрольной суммы (аналогично rsync) для разделения больших файлов на куски.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .