如何处理大量(二进制)数据的版本控制


46

我是地球物理学的博士学位学生,并且处理大量的图像数据(数百GB,成千上万个文件)。我非常了解svngit开始重视项目历史,并具有轻松协作并防止磁盘损坏的能力。我发现git对于进行一致的备份也非常有帮助,但是我知道git无法有效处理大量二进制数据。

在我的硕士研究中,我研究了大小相似(也包括图像)的数据集,并且在跟踪不同服务器/设备上的不同版本时遇到很多问题。通过网络分配100GB的确不是一件好事,这花了我很多时间和精力。

我知道科学界的其他人似乎也有类似的问题,但我找不到很好的解决方案。

我想使用我研究所的存储设备,所以我需要可以使用“哑”服务器的东西。我还希望在便携式硬盘上有一个额外的备份,因为我想避免在任何可能的情况下通过网络传输数百GB。因此,我需要一种可以处理多个远程位置的工具。

最后,我确实需要其他研究人员可以使用的东西,因此它不需要超级简单,但应该可以在几个小时内学习。

我已经评估了许多不同的解决方案,但似乎都不适合:

  • svn效率低下,需要一台智能服务器
  • HG bigfile / largefile只能使用一个遥控器
  • git bigfile / media也只能使用一个远程,但是效率也不高
  • 阁楼似乎没有对数或差异功能
  • bup看起来确实不错,但是需要“智能”服务器才能工作

我已经尝试过了git-annex,它可以完成我需要做的所有事情(还有更多),但是使用起来非常困难,并且没有很好的文档记录。我已经使用了几天,无法理解,所以我怀疑其他任何同事都会对此感兴趣。

研究人员如何处理大型数据集,其他研究小组正在使用什么?

需要明确的是,我主要对其他研究人员如何处理这种情况感兴趣,而不仅仅是这个特定的数据集。在我看来,几乎每个人都应该有这个问题,但我不知道有谁解决了这个问题。我应该只保留原始数据的备份,而忘记所有这些版本控制内容吗?那是其他人在做什么吗?


1
@scaaahu我认为这不一定是软件问题;可接受的答案还可以描述工作流程或工具和系统的组合。(无论如何,在其他地方讨论主题不应影响在此处结束问题的决定。)

2
为了防止图像数据损坏数据,我定期运行一个脚本,该脚本重新计算包含所有文件及其md5校验和的校验和文件。然后将校验和文件保存在git中。现在,我可以立即用git diff查看是否任何校验和已更改。而且我还可以看到已删除和添加了哪些文件。并且,例如,如果有任何数据损坏的迹象,那么我可以使用常规备份来还原旧版本。不完美,但总比没有好。

1
@JukkaSuomela我认为这是一个合理的问题,当你有非常大的数据集,如果这些数据集频繁变化......在这些情况下,备份通常什么作为版本控制。

1
我投票结束这个题为离题,因为它处理的是数据/数据库,而不是学术界的特定问题。问题很严重,应将(IMHO)移至DataScience.SE或(也许)Databases.SE。
Piotr Migdal

1
@Johann数据科学家有不同的背景。例如,我的研究领域是量子力学。这里的全部要点是:1. StackExchange不鼓励所谓的“ 划船问题”,并且2.更好地获取最佳实践,而不是必须解决但又不知道的人如何解决。
Piotr Migdal

Answers:


12

我最终使用的是一种混合解决方案:

  • 原始数据的备份
  • 工作流程的git
  • 相关的工作流程和已处理数据的手动快照,例如:
    • 标准预处理
    • 真的很耗时
    • 出版

我认为拥有大量二进制数据的完整修订历史几乎是不明智的,因为复查更改所需要的时间最终将是巨大的,以至于长远来看不会得到回报。也许是半自动快照过程(最终通过不跨不同快照复制未更改的数据来节省一些磁盘空间)会有所帮助。


好吧,我find . -type f -print0 | xargs -0 md5sum > checksums.md5用来计算校验和和md5sum -c checksums.md5校验和,以及版本控制校验和。这有助于检查不同位置/不同计算机上的数据。似乎是我们目前能做的最好的事情
约翰·约翰·约翰(Johann)2015年

如果通过修改数据来始终更改其文件名,那么这可能是一个很好的解决方案。否则,我强烈建议您检查数据本身,例如,检查rsync原始数据(副本)。在神经科学中很常见的另一种可能性(尽管我不太喜欢它,因为有时它没有应有的详细记录),是使用nipype python软件包,它可以看作是(某种)工作流程管理器,并自动管理分析中间步骤的二进制数据缓存。
norok2

@norok,您描述了一个很棒的通用框架。我已经在DVC工具中实现了类似的功能-请在下面查看我的答案。非常感谢您的反馈。
德米特里·彼得罗夫

9

我已经用非常庞大的合成生物学数据集处理了类似的问题,在该数据集中,我们有许多GB的流式细胞术数据分布在许多文件中,并且需要在(多个)不同机构的协作小组之间保持一致。

在这种情况下,像svn和git这样的典型版本控制不切实际,因为它不是为此类数据集设计的。相反,我们只能使用“云存储”解决方案,尤其是DropBoxBittorrent Sync。DropBox的优点是它至少可以执行一些原始的日志记录和版本控制并为您管理服务器,但缺点是它是一项商业服务,您需要为大型存储付费,并且会将未发布的数据放在服务器上。商业存储;不过,您不必支付太多,因此这是一个可行的选择。Bittorrent Sync具有非常相似的界面,但是您可以在自己的存储服务器上自己运行它,并且没有任何版本控制。他们俩都伤害了我的程序员灵魂,但是到目前为止,它们是我和我的合作者找到的最好的解决方案。


Dropbox有一个流行的开源版本OwnCloud。我还没有尝试过。



6

我们不对实际数据文件进行版本控制。即使我们将其存储为CSV而不是二进制格式,我们也不需要。正如Riccardo M.所说,我们不会花时间来审查1000万行数据集的逐行更改。

相反,与处理代码一起,我对元数据进行版本控制:

  • 修改日期
  • 文件大小
  • 行数
  • 列名

这给了我足够的信息来了解,如果一个数据文件已经改变,一个想法是什么发生了变化(例如,添加的行/删除,新/重命名列),不强调VCS。


5

这是一个很常见的问题。当我为一所大学进行研究项目时(现在是工业数据科学项目),我感到非常痛苦。

我创建并最近发布了一个开放源代码工具来解决此问题-DVC

它基本上将Git中的代码与本地磁盘或云中的数据(S3和GCP存储)结合在一起。DVC跟踪数据和代码之间的依赖关系,并构建依赖关系图(DAG)。它可以帮助您使项目可重现。

DVC项目可以轻松共享-将数据同步到云(dvc sync命令),共享Git存储库,并提供对云中数据桶的访问。

“可以在几个小时内学习”-是一个好点。如果您熟悉Git,则DVC应该不会有任何问题。您确实只需要学习三个命令:

  1. dvc initgit init。应该在现有的Git存储库中完成。
  2. dvc import-导入您的数据文件(源)。本地文件或URL。
  3. dvc run-您的工作流程步骤,例如dvc run python mycode.py data/input.jpg data/output.csv。DVC会自动导出步骤之间的依赖关系,构建DAG并将其保留在Git中。
  4. dvc repro-复制您的数据文件。示例:vi mycode.py-更改代码,然后dvc repro data/output.csv将重现文件(以及所有依赖项。

您需要学习更多DVC命令以通过云和基本的S3或GCP技能共享数据。

DVC教程是最佳起点- “数据版本控制:迭代机器学习”


1
可以仅用于存储较大的二进制文件(主要是视频)吗?ML不是目标。目标是拥有一个可以存储较大二进制文件的存储库。回购应该具有缓存,选择性签出/拉取(如perforce)和文件/目录锁定机制。是否适合这种目的?
hemu

1
@hemu是的。对于没有ML功能(例如ML管道和可再现性)的基本大数据文件方案,DVC可以很好地工作。由于Git语义,不支持Perforce-lock语义。请改用按文件结帐。
德米特里·彼得罗夫


0

您可以看一下我的项目DOT:Distrubuted Object Tracker存储库管理器。
这是一个非常简单的VCS,用于二进制文件供个人使用(无需协作)。
它使用SHA1进行校验和和块重复数据删除。完整的P2P同步。
一项独特功能:即席使用一次TCP服务器进行拉/推。
它还可以使用SSH进行传输。

它尚未发布,但可能是一个很好的起点。
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

您可以尝试使用机库。它是数据版本控制领域中一个相对较新的播放器,但通过对张量进行版本控制而不是对Blob进行版本处理,确实做得很好。文档必须是最佳起点。由于数据被存储为张量,因此您应该能够直接在ML代码中使用它(而且机库现在具有用于PyTorch和Tensorflow的数据加载器)。使用机库,您可以获得git的所有好处,例如零成本分支,合并,穿越历史的时光。关于在机库中进行克隆的一个不错的功能是可以进行部分克隆。这意味着,如果远程有10 TB的数据,并且只需要100 MB的模型原型,则可以通过部分克隆而不是完整克隆来仅获取100 MB。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.