GNU/Linux >> Znalost Linux >  >> Linux

Proč komprese Gzip neodstraní duplicitní kusy dat?

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

Linux
  1. Komprimujte soubory při čtení dat ze STDIN

  2. Proč na mém počítači Ubuntu nefunguje název hostitele --fqdn?

  3. Proč nemůžete jednoduše dd CD Audio jako obyčejné datové CD?

  1. Redis jako mezipaměť:Jak to funguje a proč ji používat

  2. Proč wget neověřuje certifikáty SSL?

  3. Proč se používá Swap, když zbývá spousta volné paměti?

  1. Proč xargs -L poskytuje správný formát, zatímco xargs -n ne?

  2. Proč `\d` nefunguje v regulárních výrazech v sed?

  3. Proč Bash `(())` nefunguje uvnitř `[[]]`?