让我尝试总结一下 DVC 是如何存储数据的,我希望您能够从中计算出在您的特定场景中将节省/消耗多少空间。
DVC 在单个文件级别存储和删除重复数据。那么,从实际的角度来看,这通常意味着什么。
我将dvc add用作示例,但相同的逻辑适用于将数据文件或目录保存到 DVC 缓存中的所有命令 - dvc add、dvc run等。
场景一:修改文件
假设我有一个 1GB 的 XML 文件。我开始用 DVC 跟踪它:
$ dvc add data.xml
在现代文件系统上(或者hardlinks,如果symlinks启用,请参阅此命令以获取更多详细信息)在此命令之后我们仍然消耗 1GB(即使文件已移动到 DVC 缓存并且仍然存在于工作区中)。
现在,让我们稍微改变一下并再次保存:
$ echo "<test/>" >> data.xml
$ dvc add data.xml
在这种情况下,我们将消耗 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)
场景二:修改目录
现在让我们假设我们有一个 1GB 的大目录,里面images有很多文件:
$ du -hs images
1GB
$ ls -l images | wc -l
1001
$ dvc add images
此时我们仍然消耗 1GB。什么也没有变。但是如果我们通过添加更多文件(或删除其中一些文件)来修改目录:
$ cp /tmp/new-image.png images
$ ls -l images | wc -l
1002
$ dvc add images
在这种情况下,保存新版本后我们仍然接近 1GB 的消耗。DVC 在目录级别计算差异。它不会保存目录中之前存在的所有文件。
相同的逻辑适用于将数据文件或目录保存到 DVC 缓存中的所有命令 - dvc add、dvc run等。
请让我知道是否清楚,或者我们需要添加更多细节,澄清。