Nicole Hamilton správně poznamenává, že gzip
nenajde vzdálená duplicitní data kvůli malé velikosti slovníku.
bzip2
je podobný, protože je omezen na 900 KB paměti.
Místo toho zkuste:
Algoritmus LZMA/LZMA2 (xz
, 7z
)
Algoritmus LZMA je ve stejné rodině jako Deflate, ale používá mnohem větší velikost slovníku (lze přizpůsobit; výchozí je něco jako 384 MB). xz
obslužný program, který by měl být standardně nainstalován na nejnovějších linuxových distribucích, je podobný gzip
a používá LZMA.
Protože LZMA detekuje redundanci delšího dosahu, bude zde moci deduplikovat vaše data. Je však pomalejší než Gzip.
Další možností je 7-zip (7z
, v p7zip
package), což je archivátor (spíše než jednoproudový kompresor), který standardně používá LZMA (napsaný autorem LZMA). Archivátor 7-zip spouští vlastní deduplikaci na úrovni souborů (prohlíží soubory se stejnou příponou) při archivaci na svůj .7z
formát. To znamená, že pokud jste ochotni nahradit tar
s 7z
, získáte deduplikaci stejných souborů. 7z však nezachovává nanosekundová časová razítka, oprávnění ani xattrs, takže nemusí vyhovovat vašim potřebám.
lrzip
lrzip
je kompresor, který předzpracovává data, aby odstranil nadbytečnost na dlouhé vzdálenosti, než je předá konvenčnímu algoritmu, jako je Gzip/Deflate, bzip2, lzop nebo LZMA. Pro ukázková data, která zde uvádíte, to není nutné; je to užitečné, když jsou vstupní data větší, než kolik se vejde do paměti.
Pro tento druh dat (duplikované nestlačitelné bloky) byste měli použít lzop
komprese (velmi rychlá) s lrzip
, protože není přínosné snažit se více komprimovat zcela náhodná data, jakmile byla deduplikována.
Bup and Obnam
Protože jste otázku zálohování označili, pokud je vaším cílem zálohování dat, zvažte použití deduplikačního zálohovacího programu, jako je Bup nebo Obnam.
Gzip gzip je založen na algoritmu DEFLATE, který je kombinací LZ77 a Huffmanova kódování. Jde o bezztrátový algoritmus komprese dat, který funguje tak, že transformuje vstupní proud na komprimované symboly pomocí slovníku vytvořeného za běhu a sleduje duplikáty. Ale nemůže najít duplikáty oddělené více než 32 kB. Očekávání, že odhalí duplikáty vzdálené 1 MB, není reálné.
gzip
nenajde duplikáty, dokonce ani xz
s velkou velikostí slovníku nebude. Co můžete udělat, je použít mksquashfs
- to skutečně ušetří místo pro duplikáty.
Několik rychlých výsledků testu s xz
a mksquashfs
se třemi náhodnými binárními soubory (64 MB), z nichž dva jsou stejné:
Nastavení:
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 ..
Squashfs:
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