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