4

有没有办法让 zstd 压缩文件像 gzip 那样使用--rsyncable选项“rsyncable”?

我尝试将输入文件拆分为固定长度的块并单独压缩它们,但没有成功。

关于--rsyncable选项:

当您在两台计算机之间同步压缩文件时,此选项允许 rsync 仅传输存档中更改的文件,而不是整个存档。通常,在对档案中的任何文件进行更改后,压缩算法可以生成与档案的先前版本不匹配的新版本的档案。在这种情况下,rsync 会将整个新版本的存档传输到远程计算机。使用此选项,rsync 可以仅传输更改的文件以及更新更改区域中的存档结构所需的少量元数据。

4

2 回答 2

9

随着版本 1.3.8 zstd 引入了--rsyncable模式。

于 2019-01-09T09:32:59.463 回答
2

我尝试将输入文件拆分为固定长度的块并单独压缩它们,但没有成功。

如果您只更改字节而不移动它们,这应该工作 NP。

也就是说,如果你分割"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 不会传输其余的块。

PS 看起来LBFS 使用了这样的块拆分方案:“通过在文件上滑动一个 48 字节的窗口并计算每个窗口的 Rabin 指纹。当指纹的低 13 位为零时,LBFS 将这 48 个字节称为断点并结束当前块并开始一个新块

于 2018-02-10T21:19:26.990 回答