Nicole Hamilton nota correttamente che gzip
non troverà dati duplicati distanti a causa delle ridotte dimensioni del dizionario.
bzip2
è simile, perché è limitato a 900 KB di memoria.
Invece, prova:
Algoritmo LZMA/LZMA2 (xz
, 7z
)
L'algoritmo LZMA appartiene alla stessa famiglia di Deflate, ma utilizza una dimensione del dizionario molto più grande (personalizzabile; l'impostazione predefinita è qualcosa come 384 MB). Il xz
utility, che dovrebbe essere installata per impostazione predefinita sulle distribuzioni Linux più recenti, è simile a gzip
e utilizza LZMA.
Poiché LZMA rileva la ridondanza a lungo raggio, sarà in grado di deduplicare i tuoi dati qui. Tuttavia, è più lento di Gzip.
Un'altra opzione è 7-zip (7z
, nel p7zip
pacchetto), che è un archiviatore (piuttosto che un compressore a flusso singolo) che utilizza LZMA per impostazione predefinita (scritto dall'autore di LZMA). L'archiviatore a 7 zip esegue la propria deduplicazione a livello di file (esaminando i file con la stessa estensione) durante l'archiviazione nel suo .7z
formato. Ciò significa che se sei disposto a sostituire tar
con 7z
, ottieni file identici deduplicati. Tuttavia, 7z non conserva timestamp, autorizzazioni o xattr in nanosecondi, quindi potrebbe non soddisfare le tue esigenze.
lrzip
lrzip
è un compressore che preelabora i dati per rimuovere la ridondanza a lunga distanza prima di inviarli a un algoritmo convenzionale come Gzip/Deflate, bzip2, lzop o LZMA. Per i dati di esempio che fornisci qui, non è necessario; è utile quando i dati di input sono più grandi di quelli che possono stare in memoria.
Per questo tipo di dati (pezzi incomprimibili duplicati), dovresti usare lzop
compressione (molto veloce) con lrzip
, perché non c'è alcun vantaggio nel sforzarsi di comprimere dati completamente casuali una volta che sono stati deduplicati.
Bup e Obnam
Dato che hai taggato la domanda backup, se il tuo obiettivo qui è il backup dei dati, prendi in considerazione l'utilizzo di un programma di backup di deduplicazione come Bup o Obnam.
Gzip gzip si basa sull'algoritmo DEFLATE, che è una combinazione di codifica LZ77 e Huffman. È un algoritmo di compressione dei dati senza perdita che funziona trasformando il flusso di input in simboli compressi utilizzando un dizionario creato al volo e controllando i duplicati. Ma non riesce a trovare duplicati separati da più di 32K. Aspettarsi che rilevi i duplicati a distanza di 1 MB non è realistico.
gzip
non troverà duplicati, nemmeno xz
con un'enorme dimensione del dizionario non lo farà. Quello che puoi fare è usare mksquashfs
- questo salverà davvero lo spazio dei duplicati.
Alcuni rapidi risultati del test con xz
e mksquashfs
con tre file binari casuali (64MB) di cui due uguali:
Configurazione:
mkdir test
cd test
dd if=/dev/urandom of=test1.bin count=64k bs=1k
dd if=/dev/urandom of=test2.bin count=64k bs=1k
cp test{2,3}.bin
cd ..
Squash:
mksquashfs test/ test.squash
> test.squash - 129M
xz:
XZ_OPT='-v --memlimit-compress=6G --memlimit-decompress=512M --lzma2=preset=9e,dict=512M --extreme -T4 ' tar -cJvf test.tar.xz test/
> test.tar.xz - 193M