Стиснення багатьох подібних великих файлів


18

У мене є сотні подібних великих файлів (по 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 файлах із набору.
osgx

Відповіді:


12

З огляду на ваші дані, я припускаю, що ви переконалися, що у ваших файлах дійсно є 99% спільних даних із суміжним (або майже суміжним) на 1% різницею.

По-перше, ви повинні використовувати tar для створення одного архіву зі своїми файлами всередині нього. Для тестів я створив би .tar з 10 файлами, тобто розміром 300 Мб.

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

Я б також використав пресет --extreme, щоб перевірити, чи має це значення.

Розмір словника

В одній документації, яку я маю - сайту - сказано, що розмір словника приблизно дорівнює використанню пам'яті декомпресора. А параметр -1 означає дікт 1MiB, -6 означає 10 MiB (або 8 MiB в іншій частині того ж посібника). Ось чому ви не отримуєте жодної переваги, розміщуючи ці файли разом. Використання -9 призведе до того, що декомпресор (і, значить, словник) складе 64 Мб, і я думаю, що саме цього ви хотіли.

Редагувати

Іншою можливістю буде використання іншого компресора. Я б пішов із 7zip, але спочатку відзначив би ці файли, а потім 7zip.

Залежно від вмісту ваших файлів, можливо, ви можете використовувати 7zip методом PPM-D (замість LZMA або LZMA2, тобто за замовчуванням і те саме, що використовується xz)

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


І Xz, і 7-Zip використовують LZMA2, так що користі там не буде. PPMD оптимізовано для надзвичайно повільного, але високого рівня стиснення ентропійного вилучення з уже стиснених носіїв (наприклад, MP3 та відео). Не особливо ймовірно знайти велику схожість між двома файлами та зберегти їх у словнику - не частіше, ніж LZMA2.
allquixotic

woliveirajr, а як використовувати -1або не -9встановити, але вказати dict=64MBабо dict=128MBвстановити mode=fast?
osgx

Використання dict = xxMB замість -1 або -9 перейде до прямої точки, але оскільки я не знаю, як xz встановлює інші параметри, коли ви просто використовуєте -9, я не знаю, чи не пропустите ви щось ще. Я думаю, що ви в правильному напрямку, і лише тестування дасть точну відповідь.
woliveirajr

3
За допомогою xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2Gмене вдалося стиснути 250 файлів (7,5 ГБ) до 18 МБ архіву tar.xz.
osgx

@osgx :) це дуже приємно. Якщо це не зайняло занадто багато часу (тобто це під ваші потреби), проблема вирішена! :) Отже, ви отримали final_size = 13MB + x * 6kB, більш-менш.
woliveirajr

9

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

Якщо вона не є сукупною, ви повинні:

  • Візьміть будь-який довільний файл як "базовий"
  • Запустіть bsdiffпорівняння базового файлу з кожним додатковим файлом
  • Зберігайте кожен розріз як окремий файл поряд із базовим файлом
  • Запускайте компресор, як xzу всіх результатах (базова лінія + різниця).

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

Потім ви можете "відновити" оригінальні файли, застосувавши "розріз" вгорі від базової лінії, щоб вивести кожен з інших файлів.


Не кумулятивний. ("Кожна пара файлів має 99% однакових даних ...")
osgx

1
Якщо відмінності не є сукупними, то це має бути хорошим застосуванням bsdiffалгоритму. Спробувати.
allquixotic

Дякую за вашу відповідь, але я вже виконав завдання з xz: tar c directory|xz --lzma2=dict=128M,mode=fastта видалив вхідні файли. Насправді мої вхідні файли були текстовими, тому я навіть можу використовувати diff замість bsdiff(який не встановлений на моєму ПК).
osgx

5

Ви (я) можете використовувати дьоготь із деяким архіватором, здатним виявити діапазон дальнього діапазону, наприклад, 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) для розділення великих файлів на шматки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.