![Может ли rsync обновить большой файл, который был изменен лишь частично, без полной повторной передачи?](https://rvso.com/image/112010/%D0%9C%D0%BE%D0%B6%D0%B5%D1%82%20%D0%BB%D0%B8%20rsync%20%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB%2C%20%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9%20%D0%B1%D1%8B%D0%BB%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%20%D0%BB%D0%B8%D1%88%D1%8C%20%D1%87%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%2C%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B9%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B8%3F.png)
Я вношу небольшие изменения в очень большой файл изображения (разница всего в несколько пикселей), передача которого по сети занимает много времени.
Есть ли способ, с помощью которого rsync может определить разницу в файле и отправить по сети только небольшую разницу?
решение1
rsync
Алгоритм дельта-передачи делает это по умолчанию. Цитатастраница руководства rsync:
ОПИСАНИЕ
Rsync — это быстрый и необычайно универсальный инструмент копирования файлов. Он может копировать локально, на другой хост или с другого хоста через любую удаленную оболочку, или на удаленный демон rsync или с него. Он предлагает большое количество опций, которые контролируют каждый аспект его поведения и позволяют очень гибко определять набор копируемых файлов.Он известен своим алгоритмом дельта-передачи, который уменьшает объем данных, отправляемых по сети, отправляя только различия между исходными файлами и существующими файлами в месте назначения.. Rsync широко используется для резервного копирования и зеркалирования, а также в качестве улучшенной команды копирования для повседневного использования.
Если вы хотите отключить его, вам придется использовать опцию -W
или --whole-file
.
-W, --весь-файл
Эта опция отключает алгоритм дельта-передачи rsync, который заставляет все передаваемые файлы отправляться целиком. Передача может быть быстрее, если эта опция используется, когда пропускная способность между исходной и целевой машинами выше, чем пропускная способность к диску (особенно когда «диск» на самом деле является сетевой файловой системой). Это значение по умолчанию, когда и источник, и назначение указаны как локальные пути, но только если не действует опция пакетной записи.
Если вы действительно знаете, насколько сильно изменился ваш файл, вы даже можете оптимизировать поведение дельта-передачи, настроив размер дельта-блока:
-B, --block-size=РАЗМЕРБЛОКА
Это принудительно устанавливает размер блока, используемый в алгоритме дельта-передачи rsync, на фиксированное значение. Обычно он выбирается на основе размера каждого обновляемого файла. Подробности см. в техническом отчете.
А если вам нужна более подробная информация о самом алгоритме, вы можете найти ее здесь:Алгоритм Rsync
решение2
То, что вы искали, это опции --partial
и --inplace
. Я нашел их вчера, так как мне нужно обновить 100 ГБ до 300 ГБ отдельных файлов по сети. Это также лучше всего работает с новыми версиями rsync. Тот, что в cygwin, похоже, работает не очень хорошо. Но от любого полусовременного Linux до Linux ограничением является не сеть, а, скорее, скорость, с которой каждый конец может читать уже переданные файлы.
Я использую именно это:
rsync -avPHx --inplace --partial src/foo remote_host:/target/path/
Редактировать - источник былhttps://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/- обратите внимание, что --append
, упомянутый в исходной статье, может быть опасен, так как если файл растет и имеет изменения в середине, --append
холм не будет работать так, как ожидалось. По сути, используйте только --append
для таких вещей, как файлы журналов, к которым только когда-либо добавляются.
решение3
Все говорят правду о том, как работает rsync, но единственные форматы, в которых небольшое изменение изображения, скорее всего, приведет к небольшому изменению файла, — это форматы необработанных растровых изображений (.bmp, .pnm, некоторые типы .tif). Обычные файлы .png или JPEG, или Gimp или Photoshop .xcf или .psd, они уже сжаты, поэтому, скорее всего, небольшое изменение изображения приведет к почти совершенно другому файлу на диске. Вот почему дельта-алгоритм rsync кажется довольно неэффективным.