Comprime rsync -z
blocos de cada arquivo sem considerar o arquivo anterior ou o dicionário de compactação é redefinido para cada arquivo para que seja tratado de forma independente?
Como exemplo, considere um arquivo compactável one.txt
e sua cópia idêntica sendo transferida para um servidor remoto, onde nenhum arquivo ainda existe:
cp -p one.txt two.txt
rsync -az one.txt two.txt remote:
A zlib
camada de compactação trata one.txt
e two.txt
independentemente, ou a transferência de dados nesse nível é simplesmente um fluxo contínuo, então ele terá aprendido um dicionário de compactação útil para one.txt
o qual pode aplicar two.txt
?
Alternativamente, eu entendi completamente mal o zlib
algoritmo de compressão, de tal forma que (por exemplo) o dicionário é sempre redefinido para cada novo bloco?
Eu tentei olhar para a rsync
saída de depuração, rsync -avvvvz --debug=IO1,IO2,IO3,IO4 --msgs2stderr
mas não consigo ver nada que se relacione especificamente com a camada de compressão.
(Isso está seguindo um tópico de comentários em uma resposta minha no ServerFault.)
rsync
usa compactação emtoken.c
, e aparentemente apenas lá. Ele mantém o estado do fluxo deflate natx_strm
variável e redefine o estado do fluxosend_deflated_token
se o token anterior for -1:Isso é usado de
match.c
, por meio damatch
função, usada porhash_search
ematch_sums
. Essas funções sempre garantem que elas terminem seu processamento com uma chamada que deixalast_token
definida como -1, para que a próxima chamada redefina o fluxo deflate. Tudo isso é feito arquivo por arquivo, de modo que o fluxo de deflate é sempre redefinido no início de cada arquivo.Isso significa que é garantido que o dicionário de compactação de blocos será redefinido para cada arquivo; pode ser redefinido com mais frequência.
Se
rsync
for usar dados de arquivos anteriores, pode ser mais interessante estender sua manipulação de hash entre os arquivos.Você pode verificar tudo isso experimentalmente sincronizando várias cópias de arquivos compactáveis, como você sugere; as estatísticas sempre mostram que o tamanho transferido é igual ao tamanho compactado de um único arquivo, multiplicado pelo número de cópias, portanto, não há duplicação de um tipo ou de outro entre os arquivos.