O rsync pode atualizar um arquivo grande que foi alterado apenas parcialmente sem retransmissão total?

15

Estou fazendo uma pequena alteração em um arquivo de imagem de arquivo muito grande (apenas alguns pixels de diferença) que demora muito para ser transferido pela rede.

Existe uma maneira do rsync identificar a diferença no arquivo e enviar apenas a pequena diferença pela rede?

David Parks
fonte
3
Ao copiar em uma rede, rsyncse comporta dessa maneira por padrão. Desde que a alteração menor seja uma alteração menor no arquivo e o arquivo já exista nos dois lados do link em versões quase idênticas, os dados transferidos devem ser muito menores que o tamanho total do arquivo. Desde o primeiro parágrafo da página de manual: "É famoso por seu algoritmo de transferência delta, que reduz a quantidade de dados enviados pela rede, enviando apenas as diferenças entre os arquivos de origem e os existentes no destino".
User4556274
Ah, ok, você deve postar isso como uma resposta e não como um comentário. Não era óbvio que o rsync estava se comportando dessa maneira, mas com essa expectativa, presumo que meu arquivo tenha mudado mais do que eu esperava e analisarei o porquê. O processo de compactação da imagem provavelmente altera os valores de bytes brutos em todo o arquivo.
David Parks

Respostas:

11

rsyncO algoritmo delta-transfer faz isso por padrão. Citando a página de manual do rsync :

DESCRIÇÃO

O Rsync é uma ferramenta de cópia de arquivos rápida e extraordinariamente versátil. Ele pode copiar localmente para / de outro host em qualquer shell remoto ou para / de um daemon rsync remoto. Ele oferece um grande número de opções que controlam todos os aspectos de seu comportamento e permitem que especificações muito flexíveis do conjunto de arquivos sejam copiadas. É famoso por seu algoritmo de transferência delta, que reduz a quantidade de dados enviados pela rede, enviando apenas as diferenças entre os arquivos de origem e os arquivos existentes no destino . O Rsync é amplamente usado para backups e espelhamento e como um comando de cópia aprimorado para o uso diário.

Se você quiser desativá-lo, precisará usar a opção -Wou --whole-file.

-W, --whole-file

Esta opção desativa o algoritmo delta-transfer do rsync, que faz com que todos os arquivos transferidos sejam enviados inteiros. A transferência pode ser mais rápida se essa opção for usada quando a largura de banda entre as máquinas de origem e destino for maior que a largura de banda no disco (especialmente quando o "disco" for realmente um sistema de arquivos em rede). Esse é o padrão quando a origem e o destino são especificados como caminhos locais, mas apenas se nenhuma opção de gravação em lote estiver em vigor.

Se você realmente sabe o quanto o seu arquivo mudou, você pode até otimizar esse comportamento de transferência delta ajustando o tamanho do bloco delta:

-B, --block-size = BLOCKSIZE

Isso força o tamanho do bloco usado no algoritmo delta-transfer do rsync para um valor fixo. Normalmente, é selecionado com base no tamanho de cada arquivo que está sendo atualizado. Veja o relatório técnico para detalhes.

E se você quiser obter mais informações sobre o próprio algoritmo, pode encontrá-lo aqui: O algoritmo Rsync


fonte
Para ser justo, a forma plural de "arquivos" na página de manual é ambígua: "enviando apenas as diferenças entre os arquivos de origem e os arquivos existentes ..." Eu peguei "arquivos" para significar uma coleção de arquivos individuais, e que O rsync envia arquivos (inteiros) diferentes. Isso deve ser esclarecido.
Russ