Tengo cientos de archivos grandes similares (30 megabytes cada uno) que quiero comprimir. Cada par de archivos tiene el 99% de los mismos datos (menos de 1% de diferencia), por lo que espero no tener más de 40-50 megabytes de archivos.
Una sola fila puede ser comprimido de 30 MB a 13-15 MB (con xz -1
, gz -1
, bzip2 -1
), pero cuando la compresión de dos o más archivos que desea tener el tamaño de archivo con 13-15MB + N*0.3MB
el que N es el número de archivos.
Cuando uso tar
(para crear un archivo sólido) y xz -6
(para definir que el diccionario de compresión sea más grande que un archivo - Actualización - ¡esto no fue suficiente! ), Todavía tengo un archivo con tamaño N*13MB
.
Creo que ambos gzip
y bzip2
no me ayudarán porque tienen un diccionario de menos de 1 MB, y mi transmisión tar tiene repeticiones cada 30 MB.
¿Cómo puedo archivar mi problema en Linux moderno usando herramientas estándar?
¿Es posible sintonizar xz
para comprimir rápidamente, pero usar un diccionario de más de 30-60 MB?
Actualización : hizo el truco con tar c input_directory | xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G > compressed.tar.xz
. No estoy seguro acerca de lo necesario mf=hc4
y las --memory=2G
opciones; pero dict=128M
configure el diccionario para que sea lo suficientemente grande (más grande que un archivo) y mode=fast
haga que el proceso sea un poco más rápido que -e
.
fuente
xz -1 --memory=2G
no ayudó, probado en 2 y 4 archivos del conjunto.Respuestas:
Teniendo en cuenta sus detalles, supongo que ha verificado que sus archivos realmente tienen el 99% de datos en común, con un 1% contiguo (o casi contiguo) de diferencia en ellos.
Primero, debe usar tar para hacer un archivo con sus archivos dentro. Para las pruebas, crearía un .tar con 10 archivos, con un tamaño de 300 MB.
Luego, usando xz, debe configurarlo para que el diccionario sea más grande que el tamaño de un archivo. Como no dices si tienes restricciones de memoria, usaría xz -9. No tiene sentido no usar toda la memoria disponible.
También usaría el preajuste --extreme, para probar si hace la diferencia.
Tamaño del diccionario
En una documentación que tengo disponible, sitio , se dice que el tamaño del diccionario es aproximadamente igual al uso de la memoria del descompresor. Y el parámetro -1 significa un dict de 1MiB, -6 significa 10 MiB (u 8 MiB en otra parte del mismo manual). Es por eso que no obtienes ninguna ventaja al agrupar esos archivos. Usar el -9 haría que el descompensor (y, por lo tanto, el diccionario) sea 64 MiB, y creo que eso es lo que querías.
Editar
Otra posibilidad sería usar otro compresor. Iría con 7zip, pero primero alquilaría esos archivos y luego los comprimiría.
Dependiendo del contenido de sus archivos, quizás podría usar 7zip con el método PPM-D (en lugar de LZMA o LZMA2, ese es el valor predeterminado y el mismo que usa xz)
No es bueno: Zip (dict = 32kB), Bzip (dict = 900 kB).
fuente
-1
o-9
preset, pero especificardict=64MB
odict=128MB
y establecermode=fast
?xz --lzma2=dict=128M,mode=fast,mf=hc4 --memory=2G
pude comprimir 250 archivos (7,5 GB) a 18 MB de archivo tar.xz.Si realmente son 99% similares a lo que usted dice, debería poder usar bsdiff o un algoritmo similar para calcular las diferencias entre los archivos. ¿Es la diferencia acumulativa (es decir, cada archivo difiere un poco más del primero) o la diferencia entre dos archivos es prácticamente la misma?
Si no es acumulativo, debería poder:
bsdiff
comparación del archivo de referencia con cada archivo adicionalxz
través de los resultados (la línea de base + las diferencias).El resultado debería ser mucho más pequeño que solo
xz
el archivo completo.Luego puede "reconstituir" los archivos originales al "aplicar" el diferencial en la parte superior de la línea de base para obtener cada uno de los otros archivos.
fuente
bsdiff
algoritmo. Darle una oportunidad.tar c directory|xz --lzma2=dict=128M,mode=fast
y eliminé los archivos de entrada. En realidad, mis archivos de entrada eran texto, por lo que incluso puedo usar diff en lugar debsdiff
(que no está instalado en mi PC).Usted (I) puede usar tar con algún archivador capaz de detectar patrones de largo alcance, por ejemplo, rzip o lrzip ( Léame ). Ambos usan detección / deduplicación de redundancia de largo alcance, luego rzip usa bzip2 y lrzip usa xz (lzma) / ZPAQ:
lrzip tiene un búfer más grande y puede usar muchos algoritmos de compresión (muy rápido, rápido, bueno y uno de los mejores, ZPAQ) después de la deduplicación:
Otra forma es usar bup - programa de respaldo con deduplicación a nivel de bloque / segmento, basado en git packfile:
fuente