On Sun, May 25, 2008 at 12:31:24PM +0400, Alexander Bokovoy wrote: > Патч, который брал ты, он отличается от рекомендуемого > http://ozlabs.org/~rusty/gzip.rsync.patch2, на который ссылаются как > Джефф, так и Эгмонт. Что делает этот патч? Почему "это работает"? Прошу подсказать, правильно ли я понимаю это дело или нет. Этот патч оперирует на входном (несжатом) потоке байтов |---------------------------------------------------------> Вычисляется "контрольная сумма" (с переполнением) "окна" размером RSYNC_WIN байтов входного потока. |---------------------------------------------------------> |___________| RSYNC_WIN При добавлении каждого нового байта окно "сдвигается" и вычисляется новая сумма. |---------------------------------------------------------> -|__________+| RSYNC_WIN Особенность вычисления этой суммы состоит в том, что достаточно вычесть старый "выбывший" элемент (слева, отмечен знаком минус) и добавить новый элемент (отмечен знаком плюс). Когда сумма принимает определённое значение (а именно, когда sum % RSYNC_WIN == 0) то в конце окна принимается решение "сборосить блок" и заново инициализировать процедуру сжатия. |---------------------------------------------------------> |_____0_____| RSYNC_WIN \ `reset compression here! Это означает, что в этой точке как бы начинается "новый файл", который gzip будет жать отдельно; если в двух разных входных потоках в точке обнуления суммы несжатые данные идут одинаковые, то и сжатые данные пойдут одинаковые. Я всё равно плохо понимаю, почему "это работает", то есть как это способствует повышению rsyncability. Теперь дальше вопрос, что делает gzip при обнулении суммы? Он полностью записывает блок? Но ведь нормальный размер блока 32K, а размер окна 4K. Поскольку любое значение суммы по модулю 4096 можно считать равновероятным, то, выходит, что вместо блока 32K gzip будет делать блоки в среднем по 4K. Или нет? Чтобы понять, как работет этот код, мне нужно пере-реализовать его без привязки к гзипу. Я приложил файл rsyncable.с, в котором попытался воспроизвести то, о чём идёт речь. $ ./rsyncable