流rdiff三角差分法?

2024-05-14 18:53:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个产品可以使用rdiff进行在线备份。目前的情况是:

  1. 将文件复制到临时区域(这样文件在处理时不会消失或被修改)

  2. 散列原始文件,并计算RDIF签名(用于增量差分) 计算RDIF增量差(如果没有以前的版本,则跳过此步骤)

  3. 压缩并加密产生的增量差

目前,这些阶段的执行是截然不同的。最终的结果是我们对文件进行多次迭代。对于小文件,这不是什么大问题(尤其是在磁盘缓存的情况下),但对于大文件(10甚至100 GB),这是一个真正的性能杀手。在

我希望将所有这些步骤合并到一个读/写过程中。在

为此,我们必须能够以流式方式执行上述所有步骤,同时仍然保留所有“输出”—文件哈希、RDIF签名、压缩和加密的增量差分文件。是否需要从这个文件中读取100k的数据,然后迭代内存中的文件以更新哈希、rdiff签名、执行增量差分,然后将输出写入压缩/加密输出流。我们的目标是最大限度地减少磁盘抖动。在

目前我们使用rdiff.exe文件(这是底层librsync库之上的一层薄薄的一层),用于计算签名和生成二进制增量。这意味着这些都是在一个单独的进程中完成的,并且是一次性完成的,而不是流式的。在

如何使用librsync库来实现我需要的功能?在


Tags: 文件版本区域产品情况步骤流式差分
1条回答
网友
1楼 · 发布于 2024-05-14 18:53:00

你可以完全跳过第一步。文件在打开时无法删除,在打开时选择适当的锁定标志也可以防止文件被修改。例如,CreateFile函数接受dwShareMode参数。在

在开始创建rdiff增量之前,需要计算整个rdiff签名。通过计算签名,然后一次计算每个(比如)100MB文件块的增量,可以避免读取整个文件。这样会损失一些压缩效率*。您还可以考虑从rdiff切换到xdelta,这样可以在输入上一次性创建一个delta文件。在

压缩和加密可以与计算增量并行进行。如果压缩和加密是由单独的程序完成的,它们通常允许从标准输入读取和写入标准输出。批处理文件中的管道最容易使用此方法,例如:

rdiff signature oldfile oldfile.sig
rdiff delta oldfile.sig newfile | gzip -c | gpg -e -r ... > compressed_encrypted_delta

如果在程序中使用库进行压缩/加密,则需要选择支持流式操作的库。在

*或者,如果在文件中移动数据,则会损失很多效率。如果有人在一个10GB的文件中预加100MB,RDIF将生成一个大约100MB的增量文件。一次以100MB或更少的块进行RDIF将产生大约10GB的增量。200 MB的块将产生大约5 GB的增量,因为每个块中只有一半的数据来自旧版本文件的相应块。在

相关问题 更多 >

    热门问题