Version control 二进制增量存储

Version control 二进制增量存储,version-control,binary,storage,binary-data,delta,Version Control,Binary,Storage,Binary Data,Delta,我正在寻找一个二进制增量存储解决方案,以版本大的二进制文件(数字音频工作站文件) 在使用DAW文件时,与用于存储原始数据(waves)的大量数据相比,大多数更改(尤其是接近混合结束时)都非常小 如果我们的DAW文件有一个版本控制系统,允许我们回滚到旧版本,那就太好了 系统只保存每个版本的二进制文件(diff)之间的差异。这将为我们提供一个从当前版本更改到上一版本的说明列表,而无需存储每个版本的完整文件 目前有没有版本控制系统可以做到这一点?我读过SVN使用二进制差异来节省repo中的空间。。。但

我正在寻找一个二进制增量存储解决方案,以版本大的二进制文件(数字音频工作站文件)

在使用DAW文件时,与用于存储原始数据(waves)的大量数据相比,大多数更改(尤其是接近混合结束时)都非常小

如果我们的DAW文件有一个版本控制系统,允许我们回滚到旧版本,那就太好了

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

目前有没有版本控制系统可以做到这一点?我读过SVN使用二进制差异来节省repo中的空间。。。但我也读到过,它实际上并不适用于二进制文件,只适用于文本文件。。。不确定。有什么想法吗


到目前为止,我的行动计划是继续研究预编译工具,如果没有,请熟悉c/c++读取二进制数据并自己创建工具。

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

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

我无法评论在网络上提交大文件时可能存在的可靠性或连接问题(一篇参考文章暗示了问题)。但这里有一点经验数据,你可能会发现有用(或不有用)

我今天一直在做一些测试,研究磁盘寻道时间,所以手头有一个相当好的测试用例。我发现你的问题很有趣,所以我用我正在使用/修改的文件做了一个快速测试。我创建了一个本地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分钟。我不会根据我的结果提出这样或那样的建议。我所能说的是,它似乎工作正常,没有出现错误。而且文件差异似乎工作得很好(对于这些文件)

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    .

我不小心贴了两次这个帖子。。。但是在我的另一个线程中,我创建了一个有人说Subversion可能会工作,这取决于您对大型的定义。此问题/答案表示,只要文件小于1GB,它就可以正常工作。这是一个问题,因为几乎所有的DAW文件都将大于一个GBP,请不要在我们的网站上重复相同的问题。谢谢。重复的问题是偶然的,因为(我认为)一个错误。我试图按一次添加问题,但它给了我一个错误,说我需要等待20分钟才能提交。之后,我再次提交了两个问题,而不是一个…是的,这是关于你期望从一个二进制增量中得到什么,所以它似乎工作得很好。。。嗯。我想我必须用本地repo对我自己的文件做同样的测试。@Colton:出于好奇,我使用了默认设置的7-Zip(文件压缩实用程序)并压缩了这两个文件。它产生了一个1.88 GB的文件。因此,Subversion在本例中使用的压缩似乎也是正确的。他们可能都使用了ZLib。@Colton:你用的是什么DAW软件?这并不重要,但我很好奇。我使用Cakewalk(Sonar)并认为我应该对我的文件使用某种版本控制,但实际上从未这样做过。我做的这个小测试让我觉得我可以在家里设置它。我把理性当作一个道士。让我知道你在做什么,以及它是如何工作的:)我猜,由于实际的增量只有几兆字节,提交的10分钟大部分时间可能是在做二进制差异的东西。如果你在32位操作系统上使用git,这可能会失败。@yaruncan你能解释一下为什么你认为它会失败,为什么操作系统的琐碎是最重要的呢?我在32位系统上得到了完全相同的输出。phihag,64位操作系统与32位操作系统在这些操作需要大量ram时很重要。我主要讨论的是通过git repack和git gc之类的东西进行git压缩。事实上,这些操作在我的32位linux上总是失败的,所以我必须在另一台64位操作系统的pc上进行这些操作system@yaruncan我不同意,操作系统的点点滴滴根本不重要。您的意思是进程的可用地址空间,这是另一个问题。如果存储库确实很大,则某些操作可能无法运行。请注意,这个带有200MB文件的示例在32位系统上运行良好,但RAM小于1 GiB。此外,较新的git版本显著优化了重新打包和gc。git打包和压缩在我身上经常失败,无论我使用的打包限制如何。我只是在警告海报有危险。