是在不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 上的回答的评论线程的跟进。)
rsync
在 中使用压缩token.c
,并且似乎只存在于那里。tx_strm
它在变量中维护 deflate 流状态,并send_deflated_token
在前一个标记为 -1 时重置流状态:这从
match.c
,通过match
函数使用,由和hash_search
使用match_sums
。这些函数始终确保它们在调用last_token
设置为 -1 的情况下完成处理,以便下一次调用将重置 deflate 流。所有这些都是逐个文件完成的,因此放气流总是在每个文件的开头重置。这意味着保证为每个文件重置块压缩字典;它可能会更频繁地重置。
如果
rsync
要使用以前文件中的数据,则跨文件扩展其哈希处理可能会更有趣。正如您所建议的,您可以通过同步多个可压缩文件副本来实验性地验证所有这些;统计数据始终显示传输的大小等于单个文件的压缩大小乘以副本数,因此不会跨文件进行一种或另一种重复数据删除。