Nicole Hamilton señala correctamente que gzip
no encontrará datos duplicados distantes debido a su pequeño tamaño de diccionario.
bzip2
es similar, porque está limitado a 900 KB de memoria.
En su lugar, intente:
Algoritmo LZMA/LZMA2 (xz
, 7z
)
El algoritmo LZMA pertenece a la misma familia que Deflate, pero utiliza un tamaño de diccionario mucho más grande (personalizable; el valor predeterminado es algo así como 384 MB). El xz
La utilidad, que debe instalarse de forma predeterminada en las distribuciones de Linux más recientes, es similar a gzip
y usa LZMA.
Como LZMA detecta redundancia de mayor alcance, podrá deduplicar sus datos aquí. Sin embargo, es más lento que Gzip.
Otra opción es 7-zip (7z
, en el p7zip
paquete), que es un archivador (en lugar de un compresor de flujo único) que usa LZMA de forma predeterminada (escrito por el autor de LZMA). El archivador 7-zip ejecuta su propia deduplicación a nivel de archivo (busca archivos con la misma extensión) al archivar en su .7z
formato. Esto significa que si está dispuesto a reemplazar tar
con 7z
, obtendrá archivos idénticos deduplicados. Sin embargo, 7z no conserva las marcas de tiempo, permisos o xattrs de nanosegundos, por lo que es posible que no se adapte a sus necesidades.
lrzip
lrzip
es un compresor que preprocesa los datos para eliminar la redundancia de larga distancia antes de enviarlos a un algoritmo convencional como Gzip/Deflate, bzip2, lzop o LZMA. Para los datos de muestra que proporciona aquí, no es necesario; es útil cuando los datos de entrada son más grandes de lo que cabe en la memoria.
Para este tipo de datos (fragmentos incompresibles duplicados), debe usar lzop
compresión (muy rápida) con lrzip
, porque no hay ningún beneficio en esforzarse más para comprimir datos completamente aleatorios una vez que se han eliminado los duplicados.
Bup y Obnam
Dado que etiquetó la copia de seguridad de la pregunta, si su objetivo aquí es hacer una copia de seguridad de los datos, considere usar un programa de copia de seguridad de deduplicación como Bup u Obnam.
Gzip gzip se basa en el algoritmo DEFLATE, que es una combinación de codificación LZ77 y Huffman. Es un algoritmo de compresión de datos sin pérdidas que funciona transformando el flujo de entrada en símbolos comprimidos utilizando un diccionario construido sobre la marcha y buscando duplicados. Pero no puede encontrar duplicados separados por más de 32K. Esperar que detecte duplicados con 1 MB de diferencia no es realista.
gzip
no encontrará duplicados, incluso xz
con un tamaño de diccionario enorme no lo hará. Lo que puedes hacer es usar mksquashfs
- esto de hecho ahorrará el espacio de los duplicados.
Algunos resultados de pruebas rápidas con xz
y mksquashfs
con tres archivos binarios aleatorios (64 MB) de los cuales dos son iguales:
Configuración:
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 ..
Calabazas:
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