¿Puede rsync actualizar un archivo grande que solo ha cambiado parcialmente sin una retransmisión completa?

15

Estoy haciendo un cambio menor a un archivo de imagen de archivo muy grande (solo unos pocos píxeles de diferencia) que toma mucho tiempo transferir a través de la red.

¿Hay alguna manera para que rsync identifique la diferencia en el archivo y solo envíe el pequeño diff a través de la red?

David Parks
fuente
3
Al copiar en una red, se rsynccomporta de esta manera de manera predeterminada. Siempre que el cambio menor sea un cambio menor en el archivo, y el archivo ya exista en ambos lados del enlace en versiones casi idénticas, los datos transferidos deben ser mucho menores que el tamaño total del archivo. Desde el primer párrafo en la página del manual: "Es famoso por su algoritmo de transferencia delta, que reduce la cantidad de datos enviados a través de la red al enviar solo las diferencias entre los archivos de origen y los archivos existentes en el destino".
user4556274
Ah, está bien, deberías publicar eso como una respuesta en lugar de un comentario. No era obvio que rsync se estaba comportando de esta manera, pero con esa expectativa, supondré que mi archivo cambió más de lo que esperaba y analizaré por qué. El proceso de compresión de imágenes probablemente cambia los valores de bytes sin procesar en todo el archivo.
David Parks

Respuestas:

11

rsyncEl algoritmo de transferencia delta hace esto por defecto. Citando la página de manual de rsync :

DESCRIPCIÓN

Rsync es una herramienta de copia de archivos rápida y extraordinariamente versátil. Se puede copiar localmente, a / desde otro host a través de cualquier shell remoto, o a / desde un demonio rsync remoto. Ofrece una gran cantidad de opciones que controlan cada aspecto de su comportamiento y permiten una especificación muy flexible del conjunto de archivos a copiar. Es famoso por su algoritmo de transferencia delta, que reduce la cantidad de datos enviados a través de la red al enviar solo las diferencias entre los archivos de origen y los archivos existentes en el destino . Rsync se usa ampliamente para copias de seguridad y duplicación y como un comando de copia mejorado para el uso diario.

Si desea deshabilitarlo, deberá usar la opción -Wo --whole-file.

-W, - archivo completo

Esta opción deshabilita el algoritmo de transferencia delta de rsync, que hace que todos los archivos transferidos se envíen completos. La transferencia puede ser más rápida si esta opción se utiliza cuando el ancho de banda entre las máquinas de origen y destino es mayor que el ancho de banda al disco (especialmente cuando el "disco" es en realidad un sistema de archivos en red). Este es el valor predeterminado cuando tanto el origen como el destino se especifican como rutas locales, pero solo si no está vigente ninguna opción de escritura por lotes.

Si realmente sabe cuánto ha cambiado su archivo, incluso podría optimizar este comportamiento de transferencia delta ajustando el tamaño de su bloque delta:

-B, --block-size = BLOCKSIZE

Esto fuerza el tamaño de bloque utilizado en el algoritmo de transferencia delta de rsync a un valor fijo. Normalmente se selecciona en función del tamaño de cada archivo que se actualiza. Vea el informe técnico para más detalles.

Y si desea más información sobre el algoritmo en sí, puede encontrarlo aquí: El algoritmo Rsync


fuente
Para ser justos, la forma plural de "archivos" en la página de manual es ambigua: "al enviar solo las diferencias entre los archivos de origen y los archivos existentes ..." Tomé "archivos" para significar una colección de archivos individuales, y eso rsync enviaría archivos (enteros) que fueran diferentes. Esto debería aclararse.
Russ