Git + 大数据集?

22

我们通常会在处理大型数据集时写代码进行分析 (比如一些每个文件都有1GB的数据)。

所有的分析代码都存在于Git中,这样每个人都可以把自己的代码变更提交到中央仓库中。但是对于代码所处理的数据集应该怎么办呢?

我希望将数据放入仓库中:

  • 当用户首次克隆代码仓库时,数据应该与代码一同获取。
  • 这些数据并不是100%只读的; 偶尔也可能会出现某个数据点需要更正或者轻微格式上的变化。如果数据进行了小修改,下次检出时要通知用户。

但是,我不希望将数据放入git仓库中:

  • 如果再克隆一个副本(让我拥有两个版本),我就需要多下载几个GB的数据,而且我更愿意将其放入固定位置 [规定数据必须在~/data目录下] 或根据需要添加链接。
  • 如果将数据放入仓库,那么复制到USB存储设备上可能会很麻烦,尤其是当我只是处理100行代码时。
  • 如果修正了一个错误的数据点,我永远不会再看那个错误的版本了。数据集的更改可以通过纯文本文件或提供数据的人来跟踪(或根本不跟踪)。

看起来我需要建立一个主要代码仓库和一个辅助数据仓库。是否有任何方法可以优雅地在git中或POSIX环境下实现这一点呢?所有我所考虑的方式都有些丑陋。

5个回答

16

使用子模块将你的巨大文件与源代码隔离开来。更多信息请参考:

http://git-scm.com/book/zh/v2/Git-工具-子模块

这些示例是针对库的,但是对于像测试数据样本、图片、电影等庞大的东西也同样适用。

在开发过程中,你应该能够快速进行各种操作,只有在需要查看巨大数据的新版本时才需要暂停一下。

有时候,甚至追踪这些东西的变化都不值得。

如果你遇到了获取更多数据副本的问题:如果你的 git 实现支持在你的操作系统上的硬链接,那么这应该很容易解决。

你巨大数据集的性质也很重要。如果你改变了其中一些内容,你改变的是巨大的数据块还是数百万行中的几行?这将决定 VCS 在通知机制中的有效性。

希望这可以帮助到你。


2
链接已过期。我认为现在应该是http://git-scm.com/book/en/v2/Git-Tools-Submodules。 - Mike G
我认为将大型数据集(特别是如果它们不会改变)存储在Git中是过度的。将数据集放在Git之外,并使用简单的脚本从源复制、wget或ftp数据将是最佳选择。 - cpbills

10

这似乎是尝试使用git-annex的完美机会:

git-annex允许使用git管理文件,而不将文件内容检入git。 尽管这似乎矛盾,但在处理大于git目前可以轻松处理的文件时非常有用,无论是由于内存限制,校验和时间还是磁盘空间。


1
谢谢你的提示。由于有很多依赖关系,所以我无法在工作中使用这个,因为每个新项目都需要填写大量文档,但我一定会尝试用在其他事情上。 - bk.

2
我建议使用Git Large File Storage,它可以无缝集成到git生态系统中。它会为大文件设置文本指针,但不会将它们导出到您的存储库中。
安装后(https://packagecloud.io/github/git-lfs/install),您可以在本地repo中使用git lfs install进行设置。然后使用它很容易。告诉它要跟踪哪些类型的文件(git lfs track "*.gz"),确保您正在跟踪.gitattributes,然后它应该可以正常工作。

刚刚在亚马逊评论数据集上试了一下。结果发现,与手动添加到git相比,git lfs要慢得多。 - nz_21
1
坦白地说,我最终只是使用了Google Drive及其API,并创建了一个脚本供人们下载大文件。我保留这个答案,因为Git支持它,人们可能会发现它有用。 :/ - eric

1

Git BUP声称可以很好地增量备份大文件。

我认为BUP假定一个单独的存储库来完成它的工作,所以你最终仍然会使用子模块。但是,如果你想要良好的带宽减少,这是个好东西。


1
作为替代方案,数据可以存储在一个未被Git跟踪的文件夹中,该文件夹由P2P服务同步。我们使用这种解决方案来处理几十GB的数据集,效果非常好。
  • 数据集直接在对等节点之间共享。
  • 根据P2P软件的不同,可以保留和恢复旧版本。
  • 在更改时,数据集将自动更新。

syncthing是我们使用的软件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接