이전 파일에 관계없이 각 파일의 블록이 압축 됩니까 rsync -z
, 아니면 독립적으로 처리될 수 있도록 각 파일에 대해 압축 사전이 재설정됩니까?
예를 들어, 압축 가능한 파일 one.txt
과 해당 파일의 동일한 복사본이 두 파일 모두 존재하지 않는 원격 서버로 전송되는 경우를 생각해 보세요.
cp -p one.txt two.txt
rsync -az one.txt two.txt remote:
압축 계층이 합계를 독립적으로 zlib
처리 합니까 , 아니면 해당 수준의 데이터 전송이 연속 스트림이므로 적용할 수 있는 유용한 압축 사전을 학습하게 됩니까 ?one.txt
two.txt
one.txt
two.txt
zlib
아니면 (예를 들어) 항상 새 블록마다 사전을 재설정하는 것과 같은 압축 알고리즘을 완전히 오해하고 있습니까 ?
rsync
디버그 출력을 살펴보았지만 rsync -avvvvz --debug=IO1,IO2,IO3,IO4 --msgs2stderr
압축 레이어와 특별히 관련된 내용은 볼 수 없습니다.
(이것은 후속 조치입니다.댓글 영역ServerFault에 대한 내 답변을 바탕으로 합니다. )
답변1
rsync
압축 사용token.c
, 거기에만있는 것 같습니다. 변수에서 수축 흐름 상태를 유지하고 tx_strm
이전 플래그가 -1일 때 흐름 상태를 재설정합니다.send_deflated_token
if (last_token == -1) {
/* initialization */
if (!init_done) {
tx_strm.next_in = NULL;
tx_strm.zalloc = NULL;
tx_strm.zfree = NULL;
if (deflateInit2(&tx_strm, compression_level,
Z_DEFLATED, -15, 8,
Z_DEFAULT_STRATEGY) != Z_OK) {
rprintf(FERROR, "compression init failed\n");
exit_cleanup(RERR_PROTOCOL);
}
if ((obuf = new_array(char, OBUF_SIZE)) == NULL)
out_of_memory("send_deflated_token");
init_done = 1;
} else
deflateReset(&tx_strm);
이것은 이후에 사용됩니다match.c
,통과하다이 match
기능 hash_search
은 및 에서 사용됩니다 match_sums
. 이러한 함수는 항상 -1로 설정된 호출로 처리를 완료하여 last_token
다음 호출에서 수축 스트림을 재설정하도록 합니다. 이 모든 작업은 파일별로 수행되므로 수축 스트림은 항상 각 파일의 시작 부분에서 재설정됩니다.
이는 블록 압축 사전이 각 파일에 대해 재설정된다는 것을 보장하며 더 자주 재설정될 수 있음을 의미합니다.
이전 파일의 데이터를 사용하려는 경우 rsync
파일 전체에 걸쳐 해싱을 확장하는 것이 더 흥미로울 수 있습니다.
제안한 대로 압축 가능한 파일의 여러 복사본을 동기화하여 이 모든 것을 실험적으로 확인할 수 있습니다. 통계는 항상 전송된 크기가 개별 파일의 압축 크기에 복사본 수를 곱한 것과 동일하다는 것을 보여줍니다. 파일 전체에 걸쳐 중복된 데이터 유형이 삭제됩니다.