如何保存二进制文档的历史记录

2019-05-28 21:46:17 +08:00
 yixinlove

RT,现在老板要保留文件的历史记录。现在的想法是: 保存每个记录之前的差异部分,这就需要做二进制差异分析,看了网上好像使用的是 bsdiff/bspatch 这个算法,经过测试,发现 CPU 和内存占用开销还能说得过去。只是如果要夸几个版本恢复需要用 bspatch 算法计算几次,成本会比较高。

想问问,这种差异性算法还有其他做法吗?有没有 Git 相关概念实现可以应用到服务端的。

使用语言是 Golang。

2264 次点击
所在节点    程序员
11 条回复
ysc3839
2019-05-28 22:27:26 +08:00
git lfs?
shuax
2019-05-28 22:53:05 +08:00
要什么差异,那是拿来增量更新的。
crayygy
2019-05-28 22:59:14 +08:00
二进制的要 diff 做什么?
goreliu
2019-05-28 23:02:13 +08:00
“二进制文件”过于笼统,如果想 diff 的话,最好还是要根据文件类型来做。比如两个压缩包,如果不解压直接 diff,结果是没法看的。
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 我都没有实际用过,不知道效果怎么样
dorentus
2019-05-29 00:42:57 +08:00
直接存每个版本的原始文件,没必要 diff
yuikns
2019-05-29 05:46:07 +08:00
较大部分是相同的是适用于 diff 的前提,而大多数二进制并不是。

比如一个人 docx 文档,它本质是一个压缩包,里面内容修改后,二进制记录区别很大。
如果可以,我建议还是版本管理 rdf 或者 latex 吧,或者干脆算个 hash 保存,避免存储冗余的二进制完事。
要是闲得慌,也可以把它切成一堆小的 chunks 按照 hash 保存
mogging
2019-05-29 08:28:50 +08:00
坚果云做到了,具体细节不清楚
yixinlove
2019-05-29 09:06:18 +08:00
@ysc3839 git lfs 看过,但是这边是准备用 golang 写的一个服务端程序需要支持。
@shuax @crayygy 我描述写的是二进制文件,譬如 doc/pdf 这类。就是想保存差异部分,节省存储空间,现在我们这些文档是保存在云服务商的。

@24owls 多谢,我去研究下,看看是否可行。

@dorentus 是的,我们也想过直接存 snapshot,不过考虑到存储成本,还是想用 diff。不过这也是在调研阶段。

@yuikns 是的,我看过 docx 格式,试过用 bsdiff 算出差异,在只增加一行文字的情况下,差异部分竟然占新文件的 70%(比例不固定,这里试的是 100K 大小的文件),压缩后确实是 diff 效果不大。所以想看看有没有其他计算方式。
yuikns
2019-05-29 10:00:14 +08:00
如果特指 docx,可以把它当文件夹管理。go 内置了 zip 格式的读写
zpf124
2019-05-29 11:05:59 +08:00
文档的话, 如果是内部自己人写的文档,可是试着推一下 用 ASCIIDoc 重写, 比 md 格式全一些,而且也是文本内容 diff 非常容易.

如果是收集存储了许多资料文档备份的话.... 感觉二级制对比也比较蛋疼...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568548

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX