Estou fazendo uma pequena alteração em um arquivo de imagem muito grande (apenas alguns pixels de diferença) que leva muito tempo para ser transferido pela rede.
Existe uma maneira de o rsync identificar a diferença no arquivo e enviar apenas a pequena diferença pela rede?
Responder1
rsync
O algoritmo de transferência delta faz isso por padrão. Citandopágina de manual do rsync:
DESCRIÇÃO
Rsync é uma ferramenta de cópia de arquivos rápida e extraordinariamente versátil. Ele pode copiar localmente, de/para outro host através de qualquer shell remoto ou de/para um daemon rsync remoto. Oferece um grande número de opções que controlam todos os aspectos do seu comportamento e permitem uma especificação muito flexível do conjunto de arquivos a serem copiados.É 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. Rsync é amplamente usado para backups e espelhamento e como um comando de cópia aprimorado para uso diário.
Se quiser desativá-lo, você terá que usar a opção -W
ou --whole-file
.
-W, --arquivo inteiro
Esta opção desativa o algoritmo de transferência delta do rsync, que faz com que todos os arquivos transferidos sejam enviados inteiros. A transferência pode ser mais rápida se esta opção for usada quando a largura de banda entre as máquinas de origem e de destino for maior que a largura de banda para o disco (especialmente quando o "disco" for na verdade um sistema de arquivos em rede). Este é o padrão quando a origem e o destino são especificados como caminhos locais, mas somente se nenhuma opção de gravação em lote estiver em vigor.
Se você realmente sabe o quanto seu arquivo mudou, você pode até otimizar esse comportamento de transferência delta ajustando o tamanho do bloco delta:
-B, --block-size=TAMANHO DO BLOCO
Isso força o tamanho do bloco usado no algoritmo de transferência delta do rsync para um valor fixo. Normalmente é selecionado com base no tamanho de cada arquivo que está sendo atualizado. Consulte o relatório técnico para obter detalhes.
E se quiser mais informações sobre o algoritmo em si, você pode encontrá-lo aqui:O algoritmo Rsync
Responder2
O que você estava procurando são as opções --partial
e --inplace
. Eu os encontrei ontem porque preciso atualizar arquivos únicos de 100 GB para 300 GB pela rede. Também funciona melhor com versões mais recentes do rsync. O do cygwin não parece funcionar bem. Mas de qualquer Linux semimoderno para Linux, o limite não é a rede, mas sim a velocidade com que cada extremidade consegue ler os arquivos já transferidos.
Eu uso isso especificamente:
rsync -avPHx --inplace --partial src/foo remote_host:/target/path/
Editar - a fonte erahttps://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/- observe que --append
, mencionado no artigo fonte, pode ser perigoso porque se o arquivo crescer E tiver alterações no meio, --append
ele não funcionará conforme o esperado. Essencialmente, use apenas --append
para coisas como arquivos de log que só são anexados.
Responder3
O que todos dizem é verdade sobre como o rsync funciona, mas os únicos formatos em que uma pequena alteração na imagem provavelmente resultará em uma pequena alteração no arquivo são os formatos de bitmap brutos (.bmp, .pnm, alguns tipos de .tif). Os arquivos .png ou JPEG usuais, ou Gimp ou Photoshop .xcf ou .psd, já estão compactados, então provavelmente uma pequena alteração na imagem resultaria em um arquivo quase totalmente diferente no disco. É por isso que o algoritmo delta do rsync parece bastante ineficaz.