Может ли rsync обновить большой файл, который изменился только частично без полной повторной передачи?

15

Я делаю небольшое изменение в очень большом файле изображения (разница всего в несколько пикселей), который занимает много времени для передачи по сети.

Есть ли способ rsync, чтобы определить разницу в файле и отправлять только небольшие различия по сети?

Дэвид Паркс
источник
3
При копировании по сети rsyncведет себя так по умолчанию. Пока незначительное изменение является незначительным изменением файла, и файл уже существует по обеим сторонам ссылки в почти идентичных версиях, передаваемые данные должны быть намного меньше, чем общий размер файла. Из первого абзаца на странице руководства: «Он известен своим алгоритмом дельта-передачи, который уменьшает объем данных, передаваемых по сети, отправляя только различия между исходными файлами и существующими файлами в месте назначения».
user4556274
Ах, хорошо, вы должны опубликовать это как ответ, а не комментарий. Не было очевидно, что rsync вел себя так, но с этим ожиданием я предположу, что мой файл изменился больше, чем я ожидал, и выясню, почему. Процесс сжатия изображения, вероятно, изменяет необработанные байтовые значения по всему файлу.
Дэвид Паркс

Ответы:

11

rsyncалгоритм дельта-переноса делает это по умолчанию. Цитирование rsync manpage :

ОПИСАНИЕ

Rsync - это быстрый и необычайно универсальный инструмент для копирования файлов. Он может копировать локально, на / с другого хоста через любую удаленную оболочку или на / с удаленного демона rsync. Он предлагает большое количество параметров, которые управляют каждым аспектом его поведения и позволяют очень гибко задавать набор файлов для копирования. Он известен своим алгоритмом дельта-передачи, который уменьшает объем данных, передаваемых по сети, отправляя только различия между исходными файлами и существующими файлами в месте назначения . Rsync широко используется для резервного копирования и зеркалирования, а также как улучшенная команда копирования для повседневного использования.

Если вы хотите отключить его, вам придется использовать опцию -Wили --whole-file.

-W, --whole-файл

Эта опция отключает алгоритм дельта-передачи rsync, который заставляет все переданные файлы отправляться целиком. Передача может быть быстрее, если этот параметр используется, когда полоса пропускания между исходным и целевым компьютерами выше, чем полоса пропускания на диск (особенно, когда «диск» фактически является сетевой файловой системой). Это значение по умолчанию, когда и источник, и пункт назначения указываются в качестве локальных путей, но только если не действует опция пакетной записи.

Если вы действительно знаете, как сильно изменился ваш файл, вы можете даже оптимизировать поведение дельта-передачи, настроив размер дельта-блока:

-B, --block-size = BLOCKSIZE

Это приводит к фиксированному значению размера блока, используемого в алгоритме дельта-передачи rsync. Обычно он выбирается в зависимости от размера каждого обновляемого файла. Смотрите технический отчет для деталей.

А если вам нужна дополнительная информация о самом алгоритме, вы можете найти его здесь: Алгоритм Rsync


источник
Справедливости ради следует отметить, что форма множественного числа «файлов» на странице руководства неоднозначна: «отправляя только различия между исходными файлами и существующими файлами ...» «я» взял «файлы» как набор отдельных файлов, и это rsync будет отправлять (целые) файлы, которые отличаются. Это должно быть уточнено.
Расс