Saltar al contenido

Diferencia de dos grandes archivos binarios sin procesar similares

Luego de consultar especialistas en el tema, programadores de deferentes ramas y maestros dimos con la solución al dilema y la dejamos plasmada en este post.

Solución:

Para la segunda aplicación/problema, usaría un programa de respaldo de deduplicación como restic o borgbackup, en lugar de intentar realizar un seguimiento manual de “parches” o diferencias. Él restic El programa de copia de seguridad le permite hacer una copia de seguridad de los directorios de varias máquinas en el mismo repositorio de copia de seguridad, deduplicando los datos de la copia de seguridad tanto entre fragmentos de archivos de una máquina individual como entre máquinas. (No tengo experiencia de usuario con borgbackupasí que no puedo decir nada sobre ese programa).

Cálculo y almacenamiento de una diferencia de la abc y abc2 Los archivos se pueden hacer con rsync.

Este es un ejemplo con abc y abc2 siendo 153 MB. El archivo abc2 se ha modificado sobrescribiendo los primeros 2,3 MB del archivo con algunos otros datos:

$ ls -lh
total 626208
-rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
-rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2

Creamos nuestro parche para transformar abc en abc2 y llámalo abc-diff:

$ rsync --only-write-batch=abc-diff abc2 abc
$ ls -lh
total 631026
-rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
-rw-------  1 kk  wheel   2.3M Feb  3 17:03 abc-diff
-rwx------  1 kk  wheel    38B Feb  3 17:03 abc-diff.sh
-rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2

El archivo generado abc-diff es la diferencia real (su “archivo de parche”), mientras que abc-diff.sh es un breve script de shell que rsync crea para ti:

$ cat abc-diff.sh
rsync --read-batch=abc-diff $1:-abc

Este script modifica abc para que sea idéntico a abc2dado el archivo abc-diff:

$ md5sum abc abc2
be00efe0a7a7d3b793e70e466cbc53c6  abc
3decbde2d3a87f3d954ccee9d60f249b  abc2
$ sh abc-diff.sh
$ md5sum abc abc2
3decbde2d3a87f3d954ccee9d60f249b  abc
3decbde2d3a87f3d954ccee9d60f249b  abc2

El archivo abc-diff ahora podría transferirse a cualquier otro lugar que tenga abc. con el comando rsync --read-batch=abc-diff abcaplicarías el parche al archivo abctransformando su contenido para que sea el mismo que el abc2 archivo en el sistema donde creó el diff.

Volver a aplicar el parche por segunda vez parece seguro. No hay mensajes de error ni cambia el contenido del archivo (la suma de comprobación MD5 no cambia).

Tenga en cuenta que, a menos que cree un “parche inverso” explícito, no hay forma de deshacer fácilmente la aplicación del parche.


También probé escribiendo la modificación de 2.3 MB en algún otro lugar en el abc2 datos, un poco más adentro (alrededor de 50 MB), así como al principio. El “parche” generado tenía un tamaño de 4,6 MB, lo que sugiere que solo los bits modificados se almacenaron en el parche.

¿Cómo calcular una diferencia binaria de abc y abc2?

Usando bsdiff/bspatch o xdelta y otros.

$ bsdiff older newer patch.bin     # patch.bin is created
[...]
$ bspatch older newer patch.bin    # newer is created

Sin embargo, se deben tener en cuenta estas advertencias de las páginas del manual:

  • bsdiff utiliza una memoria equivalente a 17 veces el tamaño de archivo antiguoy requiere un tamaño de conjunto de trabajo mínimo absoluto de 8 veces el tamaño de archivo antiguo.
  • bspatch usa memoria igual al tamaño de archivo antiguo más el tamaño de archivo nuevopero puede tolerar un conjunto de trabajo muy pequeño sin una pérdida dramática de rendimiento.

¿Has probado a forzar diff para tratar los archivos como texto:

diff -ua abc abc2

Como se explica aquí.

  • -u salida NUM (predeterminado 3) líneas de contexto unificado
  • -a tratar todos los archivos como texto

Esto debería conseguirte un parche. La desventaja de esto es que las ‘líneas’ pueden ser bastante largas y eso podría inflar el parche.

Agradecemos que quieras añadir valor a nuestro contenido colaborando tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *