У меня есть сотни похожих больших файлов (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
.
источник
xz -1 --memory=2G
не помог, проверено на 2 и 4 файлах из набора.Ответы:
Учитывая ваши данные, я предполагаю, что вы убедились, что ваши файлы действительно содержат 99% общих данных с непрерывной (или почти непрерывной) разницей в них 1%.
Во-первых, вы должны использовать tar для создания одного архива с вашими файлами внутри. Для тестов я бы создал .tar с 10 файлами, размером 300 МБ.
Затем, используя xz, вы должны установить его так, чтобы словарь был больше, чем размер одного файла. Поскольку вы не говорите, если у вас есть ограничения памяти, я бы пошел с xz -9. Нет смысла не использовать всю доступную память.
Я бы также использовал предустановку --extreme, чтобы проверить, имеет ли это значение.
Размер словаря
В одной имеющейся у меня документации - site - сказано, что размер словаря примерно равен использованию памяти декомпрессором. А параметр -1 означает 1 ДБ, -6 означает 10 МБ (или 8 МБ в другой части того же руководства). Вот почему вы не получаете никаких преимуществ, собирая эти файлы вместе. Использование -9 сделает декомпрессор (и, следовательно, словарь) 64 МБ, и я думаю, что это то, что вы хотели.
редактировать
Другая возможность будет использовать другой компрессор. Я бы пошел с 7zip, но сначала скопировал бы эти файлы, а затем 7zip.
В зависимости от содержимого ваших файлов, возможно, вы могли бы использовать 7zip с методом PPM-D (вместо LZMA или LZMA2, который используется по умолчанию и используется в xz)
Не хорошо: Zip (dict = 32 кБ), Bzip (dict = 900 кБ).
источник
-1
или-9
preset, но указатьdict=64MB
илиdict=128MB
и установитьmode=fast
?xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G
я смог сжать 250 файлов (7,5 ГБ) до 18 МБ архива tar.xz.Если они действительно на 99% похожи, как вы говорите, вы сможете использовать bsdiff или аналогичный алгоритм для расчета различий между файлами. Является ли разница кумулятивной (т. Е. Каждый файл немного отличается от первого) или разница между любыми двумя файлами почти одинакова?
Если это не кумулятивно, вы должны быть в состоянии:
bsdiff
сравнение базового файла с каждым дополнительным файломxz
по результатам (базовая линия + различия).Результат должен быть намного меньше, чем просто
xz
весь архив.Затем вы можете «восстановить» исходные файлы, «применив» diff к базовой линии, чтобы получить все остальные файлы.
источник
bsdiff
алгоритма. Попробуйте.tar c directory|xz --lzma2=dict=128M,mode=fast
и удалил входные файлы. На самом деле мои входные файлы были текстовыми, поэтому я даже могу использовать diff вместоbsdiff
(который не установлен на моем ПК).Вы (I) можете использовать tar с каким-либо архиватором, способным обнаруживать паттерны на большом расстоянии, например, rzip или lrzip ( Readme ). Оба используют обнаружение / дедупликацию дальнего радиуса действия, тогда rzip использует bzip2, а lrzip использует xz (lzma) / ZPAQ:
lrzip имеет больший буфер и может использовать многие алгоритмы сжатия (очень быстрый, быстрый, хороший и один из лучших - ZPAQ) после дедупликации:
Другой способ - использовать программу резервного копирования bup с дедупликацией на уровне блоков / сегментов, основанную на git packfile:
источник