Экономим на патчах: diff, xdelta, bdelta
Программное обеспечение
Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 1 февраля 2010 года в 10:46.
Постоянная ссылка: http://www.nixp.ru/articles/17.html
У многих из нас часто возникает вопрос обновления программной части системы.
Примечание: Статья была впервые опубликована в электронном издании «Open Source» (выпуск №008 от 03.05.2006). Ее размещение на nixp.ru производится в соответствии с разрешением со стороны редакции и автора материала.
Экономия бывает разной
У многих из нас часто возникает вопрос обновления программной части системы. А у тех, кто при этом пользуется пакетами с исходными текстами программного обеспечения, регулярно появляется необходимость скачивания файлов больших объемов — даже когда обновиться надо лишь с версии x.y на x.y+1. Если разница в исходных текстах между ними невелика, то зачем же заново качать ненужную (уже имеющуюся) часть архива?
В данной ситуации сэкономить время и деньги помогут программы, которые генерируют различия между файлами. В данной статье будут описаны 3 из них:
- традиционный diff,
- xdelta,
- новый bdelta.
Первый из них (diff) генерирует различия между файлами содержимого архивов, а второй и третий между tarball’ами, т.е. в этом случае не надо распаковывать архив. Таким образом, если использовать diff, будет получен новый архив (после упаковки), идентичный требуемому по содержимому, но отличающийся от него, например, контрольной суммой. При использовании же xdelta и bdelta получаются новые архивы, полностью идентичные необходимым.
Работа с патчами и тестирование
Рассмотрим же, какой из них лучше подойдет для экономии сетевого трафика. Попробуем создать патч с gtk+-2.8.15 до gtk+-2.8.17: архив с GTK+2 довольно объемный, содержит различные файлы, и это должно помочь нам получить наглядное представление о работе рассматриваемых образцов.
Для создания патчей использовались следующие команды:
- для diff:
$ diff -urN gtk-2.8.15 gtk-2.8.17 > gtk.diff
- xdelta:
$ xdelta delta gtk+-2.8.15.tar gtk+-2.8.17.tar gtk15-17.xdt
- bdelta:
$ deltup -mjb 9 gtk+-2.8.15.tar.bz2 gtk+-2.8.17.tar.bz2 gtk15-17.dtu
Также проводились замеры времени действия и прочих параметров при помощи команды time. Замечу, что для работы diff требовалась распаковка архивов, а для xdelta — их достаточно было разархивировать (применив лишь bzip2 -d).
Результаты таковы:
- diff:
- Размер патча в сжатом виде: 896,568 байт.
- Вывод time:
- 1.93user 1.09system 0:28.40elapsed 10%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (2major+36460minor)pagefaults 0swaps
- xdelta:
- Размер патча: 1,231,943 байт.
Вывод time: 5.80user 0.17system 0:06.54elapsed 91%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+53812minor)pagefaults 0swaps
- bdelta:
- Размер патча: 358,943 байт.
- Вывод time:
- 44.92user 5.82system 0:55.14elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+13596minor)pagefaults 0swaps
Применять полученные патчи просто:
- diff:
$ patch -p1 -i file.diff
- xdelta:
$ xdelta patch file.xdt
- bdelta:
$ deltup -p file.dtu
В двух последних случаях оригинальный файл должен находиться в каталоге, в котором производится операция.
Для более удобного создания патчей deltup можно взять архив с откомпилированными программами и скриптом от автора (deltup_patch.tar.bz2, 33 КБ). Пользоваться им просто:
$ ./patch.sh file1 file2
В результате выполнения этой команды будет получен готовый патч с названием file1-file2.dtu. В качестве file1 и file2 могут выступать как обычные файлы, так и архивы tar.gz/tar.bz2.
Минусы и плюсы
Если обратиться к популярности рассматриваемых решений, то можно отметить, что diff используется повсеместно как основной формат для создания патчей, xdelta популярна в проекте KDE, а deltup встречается в системе Gentoo GNU/Linux. (До недавнего времени работал deltup-сервер http://www.rthwlr.net/ddeltup/, где находилось и регулярно пополнялось огромное количества патчей bdelta.)
К минусам xdelta и bdelta можно отнести то, что исходный файл должен полностью соответствовать тому, с которого делали патч. Недостатки xdelta — необходимость разжатия архива (прим.: не разархивирования). Среди плюсов diff возможность создания патчей не только для отдельных файлов, но и для дерева файлов. При этом diff не предъявляет жестких требований к содержимому исходного файла, что позволяет патчить не оригинальные, а слегка измененные файлы. Удивляет, что xdelta проигрывает diff в размере патча.
Выводы
Таким образом, подводя итоги, можно сказать, что:
- наилучшая экономия получается при использовании bdelta;
- xdelta предоставляет самый быстрый способ работы с патчами (это решение хорошо подходит, когда важным критерием является скорость выполнения операции);
- diff предпочтителен для удобочитаемого просмотра различий и широко распространен.
От себя же добавлю, что один хороший человек и использование bdelta помогает мне сильно экономить на GPRS-трафике.
-
Популярные в этом разделе:
- «Обзор системы фильтрации спама rspamd: возможности, конфигурация, работа»,
- «Защищаем себя средствами GnuPG»,
- «Своё интернет-радио с Icecast».
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1