RT,现在老板要保留文件的历史记录。现在的想法是: 保存每个记录之前的差异部分,这就需要做二进制差异分析,看了网上好像使用的是 bsdiff/bspatch 这个算法,经过测试,发现 CPU 和内存占用开销还能说得过去。只是如果要夸几个版本恢复需要用 bspatch 算法计算几次,成本会比较高。
想问问,这种差异性算法还有其他做法吗?有没有 Git 相关概念实现可以应用到服务端的。
使用语言是 Golang。
1
ysc3839 2019-05-28 22:27:26 +08:00
git lfs?
|
2
shuax 2019-05-28 22:53:05 +08:00
要什么差异,那是拿来增量更新的。
|
3
crayygy 2019-05-28 22:59:14 +08:00
二进制的要 diff 做什么?
|
4
goreliu 2019-05-28 23:02:13 +08:00 via Android 1
“二进制文件”过于笼统,如果想 diff 的话,最好还是要根据文件类型来做。比如两个压缩包,如果不解压直接 diff,结果是没法看的。
|
5
24owls 2019-05-28 23:25:45 +08:00
rdiff 可以用来 "compute and apply signature-based file differences",用的是 rsync 的算法
rdiff 配套的工具有 rdiffdir 和 duplicity,duplicity 包装好了一些功能,可以直接用来 "incrementally backs up files and directory" rdiff 和 duplicity 我都没有实际用过,不知道效果怎么样 |
6
dorentus 2019-05-29 00:42:57 +08:00 via iPhone
直接存每个版本的原始文件,没必要 diff
|
7
yuikns 2019-05-29 05:46:07 +08:00 via iPhone
较大部分是相同的是适用于 diff 的前提,而大多数二进制并不是。
比如一个人 docx 文档,它本质是一个压缩包,里面内容修改后,二进制记录区别很大。 如果可以,我建议还是版本管理 rdf 或者 latex 吧,或者干脆算个 hash 保存,避免存储冗余的二进制完事。 要是闲得慌,也可以把它切成一堆小的 chunks 按照 hash 保存 |
8
mogging 2019-05-29 08:28:50 +08:00
坚果云做到了,具体细节不清楚
|
9
yixinlove OP @ysc3839 git lfs 看过,但是这边是准备用 golang 写的一个服务端程序需要支持。
@shuax @crayygy 我描述写的是二进制文件,譬如 doc/pdf 这类。就是想保存差异部分,节省存储空间,现在我们这些文档是保存在云服务商的。 @24owls 多谢,我去研究下,看看是否可行。 @dorentus 是的,我们也想过直接存 snapshot,不过考虑到存储成本,还是想用 diff。不过这也是在调研阶段。 @yuikns 是的,我看过 docx 格式,试过用 bsdiff 算出差异,在只增加一行文字的情况下,差异部分竟然占新文件的 70%(比例不固定,这里试的是 100K 大小的文件),压缩后确实是 diff 效果不大。所以想看看有没有其他计算方式。 |
10
yuikns 2019-05-29 10:00:14 +08:00 via iPhone
如果特指 docx,可以把它当文件夹管理。go 内置了 zip 格式的读写
|
11
zpf124 2019-05-29 11:05:59 +08:00
文档的话, 如果是内部自己人写的文档,可是试着推一下 用 ASCIIDoc 重写, 比 md 格式全一些,而且也是文本内容 diff 非常容易.
如果是收集存储了许多资料文档备份的话.... 感觉二级制对比也比较蛋疼... |