2

我有一系列大型二进制文件,每个文件都是通过修改前一个文件生成的。它们存储在服务器上(服务器只是一个哑文件存储,我们无法在其上运行程序)。

为了节省空间,我想将它们存储为差异。当我们下载文件时问题就来了:它们太大了,以至于客户端上没有足够的磁盘空间来存储原始文件和差异文件。

是否有一种差异算法允许我们将原始文件下载到磁盘,然后在从服务器流式传输时应用补丁?AIUI,xdelta和rdiff都不能修改原文件,只能新建一个副本(会占用太多磁盘空间)。

4

2 回答 2

0

可悲的是,简短的回答是否定的。尽管...

就地修补的问题是插入和引用旧数据的混合。插入需要移动现有数据以留出足够的插入位置,即向后复制文件末尾(在一般情况下它会很慢,并且在最坏的情况下会占用文件本身的大小)。对旧数据的引用需要非常谨慎,以减少最坏的情况......

考虑到所有的限制,在修补期间在占用空间方面具有真正优势的客户端上实现这一点,补丁可能比 xdelta 或 rdiff 所做的要大得多。修补过程也会慢得多。

智能服务器的一种可能性是:

  • 将所有补丁组合成一个元补丁
  • 流式传输即时修补的原始文件(从而在线上进行重组)
于 2012-08-28T07:41:28.010 回答
0

sync diff的实现思路:

  1. 将数据裁剪成多个固定大小的块;
  2. 计算旧数据中需要保留的块;(可以使用同步算法)
  3. 按新数据顺序将保留的块排序到新位置;
  4. 下载缺失的块进行填充;

其中,最难的是优化排序块的速度,需要充分利用内存或剩余磁盘空间以最小化磁盘I/O;</p>

于 2020-07-03T10:24:24.060 回答