【问题标题】:Binary Delta Storage二进制增量存储
【发布时间】:2011-11-06 06:02:48
【问题描述】:

我正在寻找一种二进制增量存储解决方案来版本化大型二进制文件(数字音频工作站文件)

在处理 DAW 文件时,与用于存储原始数据(波形)的大量数据相比,大部分更改(尤其是在混音结束时)都非常小。

为我们的 DAW 文件提供版本控制系统会很棒,让我们能够回滚到旧版本。

系统只会保存每个版本的二进制文件(diff)之间的差异。这将为我们提供从当前版本更改为先前版本的说明列表,而无需存储每个版本的完整文件。

是否有任何当前的版本控制系统可以做到这一点?我已经阅读了 SVN 使用二进制差异来节省存储库中的空间......但我也读到它实际上并没有对二进制文件执行此操作,只有文本文件......不确定。有什么想法吗?

我现在的行动计划是继续研究现有工具,如果不存在,则熟悉 c/c++ 读取二进制数据并自己创建工具。

【问题讨论】:

  • 请不要在我们的网站上重复同样的问题。谢谢。
  • 由于(我认为)一个错误,重复的问题是偶然的。我试图按一次添加问题,但它给了我一个错误,说我需要等待 20 分钟才能提交。之后我再次提交,看到两个问题而不是一个......

标签: version-control binary storage binary-data delta


【解决方案1】:

我无法评论通过网络提交大文件时可能存在的可靠性或连接问题(一篇引用的帖子暗示了问题)。但这里有一些经验数据,您可能会觉得有用(或没用)。

我今天一直在做一些测试,研究磁盘寻道时间,因此手头有一个相当好的测试用例。我发现您的问题很有趣,因此我对正在使用/修改的文件进行了快速测试。我创建了一个本地 Subversion 存储库并向其中添加了两个二进制文件(大小如下所示),然后在对它们进行更改后提交了几次文件。较小的二进制文件 (.85 GB) 只是每次都将数据添加到它的末尾。较大的文件 (2.2GB) 包含表示由“随机”整数数据组成的 b 树的数据。在提交之间对该文件的更新涉及添加大约 4000 个新的随机值,因此修改后的节点会在整个文件中均匀分布。

这里是原始文件大小以及提交后本地 subversion 存储库中所有文件的大小/数量:

file1    851,271,675  
file2  2,205,798,400 

1,892,512,437 bytes in 32 files and 32 dirs

第二次提交后:

file1    851,287,155  
file2  2,207,569,920  

1,894,211,472 bytes in 34 files and 32 dirs

第三次提交后:

file1    851,308,845  
file2  2,210,174,976  

1,897,510,389 bytes in 36 files and 32 dirs

提交有些冗长。我没有密切关注,因为我正在做其他工作,但我认为每个人可能需要 10 分钟。检查一个特定的版本大约需要 5 分钟。我不会根据我的结果以一种或另一种方式提出建议。我只能说它似乎工作正常并且没有发生错误。并且文件差异似乎运作良好(对于这些文件)。

【讨论】:

  • 是的,这就是您对二进制增量的期望,所以它似乎工作得很好......嗯。我想我将不得不尝试使用本地存储库对我自己的文件进行相同的测试。
  • @Colton:出于好奇,我使用默认设置的 7-Zip(文件压缩实用程序)并压缩了这两个文件。它产生了一个 1.88 GB 的文件。所以在这种情况下,Subversion 使用的压缩似乎也是正确的。他们可能都使用了 ZLib。
  • @Colton:您使用的是什么 DAW 软件?并不是说它真的很重要,但我很好奇。我使用 Cakewalk (Sonar),并认为我应该对我的文件使用某种版本控制,但实际上从未这样做过。我做的这个小测试让我觉得我可以在家里设置它。
  • 我将 Reason 用作 DAW。让我了解您的工作及其运作方式:)
  • 我猜因为实际的增量只有几兆字节,所以提交所花费的 10 分钟中的大部分可能是在做二进制差异。
【解决方案2】:

Subversion 可能会起作用,具体取决于您对大型的定义。 This question/answer 表示只要您的文件小于 1 GB,它就可以正常工作。

【讨论】:

    【解决方案3】:

    Subversion 将对二进制文件和文本文件执行二进制增量。 Subversion 只是无法为二进制文件提供人类可读的 delta,并且无法帮助合并二进制文件中的冲突。

    【讨论】:

    • 我不小心把这个线程发了两次......但是......在我创建的另一个线程上,有人说 Subversion 可能会工作,这取决于你对大的定义。这个问题/答案说只要您的文件小于 1 GB,它就可以正常工作。这是一个问题,因为几乎所有 DAW 文件都将大于 GB
    【解决方案4】:

    git 压缩(你可能需要手动调用git gc),看起来非常好:

    $ git init
    $ dd if=/dev/urandom of=largefile bs=1M count=100
    $ git add largefile
    $ git commit -m 'first commit'
    [master (root-commit) e474841] first commit
     1 files changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 largefile
    $ du -sh .
    201M    .
    $ for i in $(seq 20); do date >> largefile; git commit -m "$i" -a; git gc; done
    $ du -sh .
    201M    .
    

    【讨论】:

    • 如果您在 32 位操作系统上使用 git,这可能会失败。
    • @yaruncan 您能否详细说明您认为它会失败的原因,以及为什么操作系统的琐碎性很重要?我在 32 位系统上得到完全相同的输出。
    • phihag,当您需要大量内存来执行此类操作时,64 位与 32 位操作系统很重要。我主要是通过 git repack 和 git gc 来讨论 git 压缩。事实上,这些操作在我的 32 位 linux 上总是失败,所以我必须在另一台 64 位操作系统的电脑上执行这些操作
    • @yaruncan 我不同意,操作系统的琐碎程度根本不重要。你的意思是进程的可用地址空间,这是一个不同的野兽。如果您的存储库确实很大,则某些操作可能无法正常工作。请注意,这个包含 200MB 文件的示例在 RAM 小于 1 GiB 的 32 位系统上运行良好。此外,较新的 git 版本显着优化了 repack 和 gc。
    • git 打包和压缩经常失败,无论我使用什么打包限制。我只是警告张贴者注意危险。
    猜你喜欢
    • 2012-03-17
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多