我可以大约多少钱。使用 dvc 减少磁盘体积?

Tha*_*uys 7 python sql git r dvc

我想对 ~1m+ 文档进行分类,并有一个版本控制系统用于相应模型的输入和输出。

数据随时间变化:

  • 样本量随时间增加
  • 可能会出现新功能
  • 匿名化程序可能会随着时间的推移而改变

所以基本上“一切”可能会改变:观察量、特征和值。我们有兴趣在不使用 10/100+ GB 磁盘容量的情况下使 ml 模型构建可重现,因为我们保存了输入数据的所有更新版本。目前数据的卷大小是~700mb。

我发现的最有前途的工具是:https : //github.com/iterative/dvc。目前,数据存储在数据库中,从那里加载到 R/Python 中。

题:

使用 dvc 可以(非常近似)节省多少磁盘容量?

如果可以粗略估计一下。我试图找出是否只保存了数据的“差异”。我没有通过阅读以下内容找到太多信息:https : //github.com/iterative/dvc#how-dvc-works或其他文档。

我知道这是一个非常模糊的问题。它将高度依赖于数据集。但是,我仍然有兴趣获得一个非常近似的想法。

Shc*_*ein 10

让我尝试总结一下 DVC 如何存储数据,我希望您能够从中计算出在您的特定场景中将节省/消耗多少空间。

DVC 在单个文件级别存储和删除重复数据。那么,从实践的角度来看,这通常意味着什么。

我将用dvc add作为一个例子,但同样的逻辑也适用于保存数据文件或目录到DVC缓存中的所有命令- dvc adddvc run等等。

场景一:修改文件

假设我有一个 1GB 的 XML 文件。我开始用 DVC 跟踪它:

$ dvc add data.xml
Run Code Online (Sandbox Code Playgroud)

在现代文件系统上(或者如果hardlinks,symlinks已启用,请参阅此处了解更多详细信息)执行此命令后我们仍然消耗 1GB(即使文件被移入 DVC 缓存并且仍然存在于工作区中)。

现在,让我们稍微更改一下并再次保存:

$ echo "<test/>" >> data.xml
$ dvc add data.xml
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们将消耗 2GB。DVC 不会在同一文件的两个版本之间进行差异,也不会将文件拆分为块或块以了解只有一小部分数据发生了变化。

准确地说,它计算md5每个文件并将其保存在内容可寻址的键值存储中。md5文件用作键(缓存中文件的路径),值是文件本身:

(.env) [ivan@ivan ~/Projects/test]$ md5 data.xml
0c12dce03223117e423606e92650192c

(.env) [ivan@ivan ~/Projects/test]$ tree .dvc/cache
.dvc/cache
??? 0c
   ??? 12dce03223117e423606e92650192c

1 directory, 1 file

(.env) [ivan@ivan ~/Projects/test]$ ls -lh data.xml
data.xml ----> .dvc/cache/0c/12dce03223117e423606e92650192c (some type of link)
Run Code Online (Sandbox Code Playgroud)

场景二:修改目录

现在让我们假设我们有一个images包含大量文件的1GB 大目录:

$ du -hs images
1GB

$ ls -l images | wc -l
1001

$ dvc add images
Run Code Online (Sandbox Code Playgroud)

此时我们仍然消耗1GB。什么也没有变。但是如果我们通过添加更多文件(或删除其中一些)来修改目录:

$ cp /tmp/new-image.png images

$ ls -l images | wc -l
1002

$ dvc add images
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在保存新版本后我们仍然接近 1GB 的消耗。DVC 计算目录级别的差异。它不会保存目录中之前存在的所有文件。

同样的逻辑也适用于保存数据文件或目录到DVC缓存中的所有命令- dvc adddvc run等等。

请让我知道它是否清楚,或者我们需要添加更多细节,澄清。

  • 是的,谢谢您的澄清!我的直觉是,在你的情况下,添加一个额外的步骤来使用“dvc run”运行此 SQL 并将结果保存到文件中是有意义的。然后在 R/Python 脚本中解析该文件。您还可以“dvc add”传入数据文件(以便能够在需要时恢复数据库状态)。也许,我在这里的观点是,看起来您有两个不同的流程 ETL,然后是实际的分析/模型构建。我首先决定哪个应该是可重现的。 (2认同)