Rsync peut-il mettre à jour un fichier volumineux qui n'a changé que partiellement sans retransmission complète?

15

J'apporte une modification mineure à un très gros fichier image (juste quelques pixels de différence) qui prend beaucoup de temps à transférer sur le réseau.

Existe-t-il un moyen pour rsync d'identifier la différence dans le fichier et d'envoyer uniquement le petit diff sur le réseau?

David Parks
la source
3
Lors de la copie sur un réseau, rsyncse comporte de cette façon par défaut. Tant que la modification mineure est une modification mineure du fichier et que le fichier existe déjà des deux côtés du lien dans des versions presque identiques, les données transférées doivent être bien inférieures à la taille totale du fichier. Du premier paragraphe de la page de manuel: "Il est célèbre pour son algorithme de transfert delta, qui réduit la quantité de données envoyées sur le réseau en envoyant uniquement les différences entre les fichiers source et les fichiers existants dans la destination."
user4556274
Ah, ok, tu devrais poster ça comme réponse plutôt que comme commentaire. Il n'était pas évident que rsync se comportait de cette façon, mais avec cette attente, je suppose que mon fichier a changé plus que ce à quoi je m'attendais et je chercherai pourquoi. Le processus de compression d'image modifie probablement les valeurs d'octets brutes dans tout le fichier.
David Parks

Réponses:

11

rsyncL'algorithme de transfert delta le fait par défaut. Citant la page de manuel rsync :

LA DESCRIPTION

Rsync est un outil de copie de fichiers rapide et extrêmement polyvalent. Il peut copier localement, vers / depuis un autre hôte sur n'importe quel shell distant, ou vers / depuis un démon rsync distant. Il offre un grand nombre d'options qui contrôlent tous les aspects de son comportement et permettent une spécification très flexible de l'ensemble de fichiers à copier. Il est célèbre pour son algorithme de transfert delta, qui réduit la quantité de données envoyées sur le réseau en n'envoyant que les différences entre les fichiers source et les fichiers existants dans la destination . Rsync est largement utilisé pour les sauvegardes et la mise en miroir et comme commande de copie améliorée pour un usage quotidien.

Si vous souhaitez le désactiver, vous devrez utiliser l' option -Wou --whole-file.

-W, --fichier entier

Cette option désactive l'algorithme de transfert delta de rsync, ce qui entraîne l'envoi de tous les fichiers transférés entiers. Le transfert peut être plus rapide si cette option est utilisée lorsque la bande passante entre les machines source et de destination est supérieure à la bande passante vers le disque (en particulier lorsque le "disque" est en fait un système de fichiers en réseau). Il s'agit de la valeur par défaut lorsque la source et la destination sont spécifiées comme chemins locaux, mais uniquement si aucune option d'écriture par lots n'est en vigueur.

Si vous savez vraiment à quel point votre fichier a changé, vous pouvez même optimiser ce comportement de transfert delta en ajustant la taille de votre bloc delta:

-B, --block-size = BLOCKSIZE

Cela force la taille de bloc utilisée dans l'algorithme de transfert delta de rsync à une valeur fixe. Il est normalement sélectionné en fonction de la taille de chaque fichier mis à jour. Voir le rapport technique pour plus de détails.

Et si vous voulez plus d'informations sur l'algorithme lui-même, vous pouvez le trouver ici: L'algorithme Rsync


la source
Pour être juste, la forme plurielle de "fichiers" dans la page de manuel est ambiguë: "en envoyant uniquement les différences entre les fichiers source et les fichiers existants ..." J'ai pris "fichiers" pour signifier une collection de fichiers individuels, et que rsync enverrait des fichiers (entiers) différents. Cela devrait être clarifié.
Russ