V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yixinlove
V2EX  ›  程序员

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

  •  
  •   yixinlove · 2019-05-28 21:46:17 +08:00 · 2437 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    使用语言是 Golang。

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

    比如一个人 docx 文档,它本质是一个压缩包,里面内容修改后,二进制记录区别很大。
    如果可以,我建议还是版本管理 rdf 或者 latex 吧,或者干脆算个 hash 保存,避免存储冗余的二进制完事。
    要是闲得慌,也可以把它切成一堆小的 chunks 按照 hash 保存
    mogging
        8
    mogging  
       2019-05-29 08:28:50 +08:00
    坚果云做到了,具体细节不清楚
    yixinlove
        9
    yixinlove  
    OP
       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
        10
    yuikns  
       2019-05-29 10:00:14 +08:00 via iPhone
    如果特指 docx,可以把它当文件夹管理。go 内置了 zip 格式的读写
    zpf124
        11
    zpf124  
       2019-05-29 11:05:59 +08:00
    文档的话, 如果是内部自己人写的文档,可是试着推一下 用 ASCIIDoc 重写, 比 md 格式全一些,而且也是文本内容 diff 非常容易.

    如果是收集存储了许多资料文档备份的话.... 感觉二级制对比也比较蛋疼...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:16 · PVG 07:16 · LAX 15:16 · JFK 18:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.