流式,就地二进制修补

时间:2012-08-22 09:38:10

标签: compression diff

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

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

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

2 个答案:

答案 0 :(得分:0)

简短的回答很遗憾 no 。虽然...

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

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

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

  • 将所有补丁组合成一个元补丁
  • 流式传输动态修补的原始文件(从而在线上进行重组)

答案 1 :(得分:0)

sync diff的实现思路:

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

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