使用 --rsyncable 选项使 zstd 压缩文件像 gzip 一样“可同步”
Posted
技术标签:
【中文标题】使用 --rsyncable 选项使 zstd 压缩文件像 gzip 一样“可同步”【英文标题】:Make zstd compressed files 'rsyncable' like gzip does with --rsyncable option 【发布时间】:2018-01-03 16:56:15 【问题描述】:有没有办法像 gzip 那样使用 --rsyncable
选项使 zstd 压缩文件“可同步”?
我尝试将输入文件拆分为固定长度的块并单独压缩它们,但没有成功。
关于--rsyncable
选项:
当您在两台计算机之间同步压缩文件时,此选项允许 rsync 仅传输存档中更改的文件,而不是整个存档。通常,在对档案中的任何文件进行更改后,压缩算法可以生成与档案的先前版本不匹配的新版本的档案。在这种情况下,rsync 会将整个新版本的存档传输到远程计算机。使用此选项,rsync 可以仅传输更改的文件以及更新更改区域中的存档结构所需的少量元数据。
【问题讨论】:
Rsyncable 似乎不仅是 gzip 功能,而且可能是 tar 和 gzip beeznest.com/blog/2005/02/03/rsyncable-gzip 的组合(在 tar 文件之间刷新?)。实际上,在 gzip 源代码中,这将设置 rsync 标志 (git.savannah.gnu.org/cgit/gzip.git/tree/deflate.c),它会在inflate
内部发挥一些作用,以更频繁地刷新输出。提交:git.savannah.gnu.org/cgit/gzip.git/commit/…。 zstd 现在没有直接模拟:github.com/facebook/zstd/search?q=rsync&type=Code
【参考方案1】:
随着版本 1.3.8 zstd 引入--rsyncable
模式。
【讨论】:
【参考方案2】:我尝试将输入文件拆分为固定长度的块并单独压缩它们,但没有成功。
如果您只更改字节而不移动它们,这应该可以工作。
也就是说,如果你将"The hog crawled under the high fence"
拆分成固定大小的块["The hog ", "crawled ", "under th", "e high f", "ence"]
,然后独立压缩它们,那么将“hog”更改为“dog”将是rsync友好的,因为剩余块的压缩版本, ["crawled ", "under th", "e high f", "ence"]
,还是一样。
另一方面,如果您移动字节,例如将“hog”替换为“caterpillar”,那么拆分将不再有帮助,因为块 ["The cat", "erpillar", " crawled", " under t", "he high ", "fence"]
现在不同,因此也不同它们的压缩版本。
Rsync 对前者有帮助,但对后者没有帮助。
如果您想要任意修改,您需要一种智能的块分割算法,该算法会倾向于文件的某些点。例如,如果您将空间上的"The hog crawled under the high fence"
拆分为"The ", "hog ", "crawled ", "under ", "the ", "high ", "fence"
,那么将“hog”替换为“caterpillar”只会更改一个压缩块,而 rsync 不会传输其余的块。
附:看起来像LBFS uses such a chunk splitting scheme:“通过在文件上滑动一个 48 字节的窗口并计算每个窗口的拉宾指纹。当指纹的低 13 位为零时,LBFS 将这 48 个字节称为断点并结束当前块并开始一个新的"
【讨论】:
现在我只需要一些 util 来实现类似于 gzip --rsyncable 的基于内容的切片以上是关于使用 --rsyncable 选项使 zstd 压缩文件像 gzip 一样“可同步”的主要内容,如果未能解决你的问题,请参考以下文章
使用Zstd压缩算法可以使Ubuntu 18.04安装速度提高10%
Arch Linux现在开始使用 zstd 替代 xz 进行软件包压缩