Kann rsync eine große Datei aktualisieren, die sich ohne vollständige Neuübertragung nur teilweise geändert hat?

15

Ich nehme eine geringfügige Änderung an einer sehr großen Datei-Image-Datei vor (nur ein paar Pixel Unterschied), deren Übertragung über das Netzwerk lange dauert.

Gibt es eine Möglichkeit für rsync, den Unterschied in der Datei zu identifizieren und nur den kleinen Unterschied über das Netzwerk zu senden?

David Parks
quelle
3
Verhält sich beim Kopieren über ein Netzwerk rsyncstandardmäßig so. Solange es sich bei der geringfügigen Änderung um eine geringfügige Änderung der Datei handelt und die Datei bereits in nahezu identischen Versionen auf beiden Seiten des Links vorhanden ist, sollten die übertragenen Daten viel geringer sein als die Gesamtdateigröße. Aus dem ersten Absatz der Manpage: "Es ist berühmt für seinen Delta-Transfer-Algorithmus, der die über das Netzwerk gesendete Datenmenge reduziert, indem nur die Unterschiede zwischen den Quelldateien und den vorhandenen Dateien im Ziel gesendet werden."
user4556274
Ah, ok, du solltest das eher als Antwort als als Kommentar posten. Es war nicht offensichtlich, dass sich rsync so verhält, aber mit dieser Erwartung gehe ich davon aus, dass sich meine Datei mehr als erwartet geändert hat, und untersuche, warum. Der Bildkomprimierungsprozess ändert wahrscheinlich die Rohbytewerte in der gesamten Datei.
David Parks

Antworten:

9

rsyncDer Delta-Transfer-Algorithmus macht dies standardmäßig. Zitieren der rsync-Manpage :

BESCHREIBUNG

Rsync ist ein schnelles und außerordentlich vielseitiges Tool zum Kopieren von Dateien. Es kann lokal über eine beliebige Remote-Shell oder von einem Remote-Rsync-Daemon auf einen anderen Host kopieren. Es bietet eine Vielzahl von Optionen, die jeden Aspekt seines Verhaltens steuern und eine sehr flexible Spezifikation des zu kopierenden Dateisatzes ermöglichen. Es ist berühmt für seinen Delta-Transfer-Algorithmus, der die über das Netzwerk gesendete Datenmenge reduziert, indem nur die Unterschiede zwischen den Quelldateien und den vorhandenen Dateien im Ziel gesendet werden . Rsync wird häufig für Backups und Spiegelungen sowie als verbesserter Kopierbefehl für den täglichen Gebrauch verwendet.

Wenn Sie es deaktivieren möchten, müssen Sie die Option -Woder verwenden --whole-file.

-W, - ganze Datei

Diese Option deaktiviert den Delta-Übertragungsalgorithmus von rsync, wodurch alle übertragenen Dateien als Ganzes gesendet werden. Die Übertragung kann schneller sein, wenn diese Option verwendet wird, wenn die Bandbreite zwischen dem Quell- und dem Zielcomputer höher ist als die Bandbreite zur Festplatte (insbesondere wenn die "Festplatte" tatsächlich ein vernetztes Dateisystem ist). Dies ist die Standardeinstellung, wenn sowohl die Quelle als auch das Ziel als lokale Pfade angegeben werden, jedoch nur, wenn keine Stapelschreiboption aktiviert ist.

Wenn Sie wirklich wissen, wie stark sich Ihre Datei geändert hat, können Sie dieses Delta-Übertragungsverhalten sogar optimieren, indem Sie die Größe Ihres Delta-Blocks anpassen:

-B, --block-size = BLOCKSIZE

Dies zwingt die im Delta-Transfer-Algorithmus von rsync verwendete Blockgröße auf einen festen Wert. Sie wird normalerweise basierend auf der Größe jeder zu aktualisierenden Datei ausgewählt. Einzelheiten finden Sie im technischen Bericht.

Wenn Sie weitere Informationen zum Algorithmus selbst wünschen, finden Sie diese hier: Der Rsync-Algorithmus


quelle
Um fair zu sein, ist die Pluralform von "Dateien" in der Manpage nicht eindeutig: "indem nur die Unterschiede zwischen den Quelldateien und den vorhandenen Dateien gesendet werden ..." Ich habe "Dateien" als eine Sammlung einzelner Dateien verstanden, und das rsync würde (ganze) Dateien senden, die unterschiedlich waren. Dies sollte geklärt werden.
Russ