我有一系列大型二进制文件,每个文件都是通过修改前一个文件生成的。它们存储在服务器上(服务器只是一个哑文件存储,我们无法在其上运行程序)。
为了节省空间,我想将它们存储为差异。当我们下载文件时问题就来了:它们太大了,以至于客户端上没有足够的磁盘空间来存储原始文件和差异文件。
是否有一种差异算法允许我们将原始文件下载到磁盘,然后在从服务器流式传输时应用补丁?AIUI,xdelta和rdiff都不能修改原文件,只能新建一个副本(会占用太多磁盘空间)。
我有一系列大型二进制文件,每个文件都是通过修改前一个文件生成的。它们存储在服务器上(服务器只是一个哑文件存储,我们无法在其上运行程序)。
为了节省空间,我想将它们存储为差异。当我们下载文件时问题就来了:它们太大了,以至于客户端上没有足够的磁盘空间来存储原始文件和差异文件。
是否有一种差异算法允许我们将原始文件下载到磁盘,然后在从服务器流式传输时应用补丁?AIUI,xdelta和rdiff都不能修改原文件,只能新建一个副本(会占用太多磁盘空间)。
可悲的是,简短的回答是否定的。尽管...
就地修补的问题是插入和引用旧数据的混合。插入需要移动现有数据以留出足够的插入位置,即向后复制文件末尾(在一般情况下它会很慢,并且在最坏的情况下会占用文件本身的大小)。对旧数据的引用需要非常谨慎,以减少最坏的情况......
考虑到所有的限制,在修补期间在占用空间方面具有真正优势的客户端上实现这一点,补丁可能比 xdelta 或 rdiff 所做的要大得多。修补过程也会慢得多。
智能服务器的一种可能性是:
sync diff的实现思路:
其中,最难的是优化排序块的速度,需要充分利用内存或剩余磁盘空间以最小化磁盘I/O;</p>