Czy rsync może zaktualizować duży plik, który zmienił się tylko częściowo bez pełnej retransmisji?

15

Wprowadzam niewielką zmianę w bardzo dużym pliku obrazu pliku (różnica zaledwie kilku pikseli), którego przesłanie przez sieć zajmuje dużo czasu.

Czy istnieje sposób, aby rsync rozpoznał różnicę w pliku i wysłał tylko mały plik różnicowy przez sieć?

David Parks
źródło
3
Podczas kopiowania przez sieć rsynczachowuje się domyślnie w ten sposób. Tak długo, jak niewielka zmiana jest niewielką zmianą w pliku, a plik już istnieje po obu stronach łącza w prawie identycznych wersjach, przesyłane dane powinny być znacznie mniejsze niż całkowity rozmiar pliku. Z pierwszego akapitu na stronie podręcznika: „Słynie z algorytmu transferu delta, który zmniejsza ilość danych przesyłanych przez sieć, wysyłając tylko różnice między plikami źródłowymi a istniejącymi plikami w miejscu docelowym”.
user4556274
Ach, ok, powinieneś opublikować to jako odpowiedź, a nie komentarz. Nie było oczywiste, że rsync zachowuje się w ten sposób, ale z tymi oczekiwaniami założę, że mój plik zmienił się bardziej niż się spodziewałem i sprawdzę, dlaczego. Proces kompresji obrazu prawdopodobnie zmienia wartości surowych bajtów w całym pliku.
David Parks

Odpowiedzi:

11

rsyncAlgorytm transferu delta robi to domyślnie. Cytując stronę rsync :

OPIS

Rsync to szybkie i niezwykle wszechstronne narzędzie do kopiowania plików. Może kopiować lokalnie, do / z innego hosta za pośrednictwem dowolnej zdalnej powłoki lub do / z zdalnego demona rsync. Oferuje dużą liczbę opcji, które kontrolują każdy aspekt jego zachowania i pozwalają na bardzo elastyczną specyfikację zestawu plików do skopiowania. Słynie z algorytmu transferu delta, który zmniejsza ilość danych przesyłanych przez sieć, wysyłając tylko różnice między plikami źródłowymi a istniejącymi plikami w miejscu docelowym . Rsync jest szeroko stosowany do tworzenia kopii zapasowych i kopii lustrzanych oraz jako ulepszone polecenie kopiowania do codziennego użytku.

Jeśli chcesz go wyłączyć, będziesz musiał użyć opcji -Wlub --whole-file.

-W, - cały plik

Ta opcja wyłącza algorytm rsync delta-transfer, który powoduje, że wszystkie przesyłane pliki są wysyłane w całości. Transfer może być szybszy, jeśli ta opcja jest używana, gdy przepustowość między maszyną źródłową i docelową jest większa niż przepustowość do dysku (szczególnie, gdy „dysk” jest w rzeczywistości sieciowym systemem plików). Jest to ustawienie domyślne, gdy zarówno źródło, jak i miejsce docelowe są określone jako ścieżki lokalne, ale tylko wtedy, gdy nie obowiązuje opcja zapisu wsadowego.

Jeśli naprawdę wiesz, jak bardzo zmienił się Twój plik, możesz nawet zoptymalizować zachowanie transferu delta, dostosowując rozmiar bloku delta:

-B, --block-size = BLOCKSIZE

Wymusza to wielkość bloku stosowanego w algorytmie rsync delta-transfer do stałej wartości. Zwykle jest wybierany na podstawie wielkości każdego aktualizowanego pliku. Szczegółowe informacje zawiera raport techniczny.

Jeśli chcesz uzyskać więcej informacji o samym algorytmie, możesz go znaleźć tutaj: Algorytm Rsync


źródło
Szczerze mówiąc, liczba mnoga „plików” na stronie podręcznika jest niejednoznaczna: „wysyłając tylko różnice między plikami źródłowymi a istniejącymi plikami…„ Wziąłem „pliki” jako zbiór pojedynczych plików, i że rsync wysyłał (całe) pliki, które były różne. Należy to wyjaśnić.
Russ