有人可以解释DVC如何将目录级别的差异存储到DVC缓存中。
我知道DVC文件(.dvc)是图元文件,用于跟踪数据,模型和复制管道阶段。但是,对于我来说,尚不清楚如何创建分支,提交分支以及切换回主文件的过程究竟是如何保存在一起的。
最佳答案
精简版:.dvc
文件包含有关缓存内JSON文件的信息(md5),该信息描述目录的当前状态。
更新目录后,.dvc
文件中将有新的md5,并会以目录的更新状态创建新的JSON文件。
在git中,您存储.dvc
文件,以便DVC知道(基于md5)在哪里查找有关目录的信息。
较长版本:
让我尝试打破使用DVC处理目录的特定步骤。
假设我们有一些要在DVC控制下添加的数据目录:
data
├── 1
└── 2
您正在使用
dvc add data
使DVC跟踪您的目录。结果,DVC生成data.dvc
文件。如您所述,此文件包含将git存储库与数据存储连接所需的元数据。在该文件中(除其他内容外),您可以看到:outs:
- md5: f437247ec66d73ba66b0ade0246fcb49.dir
path: data
md5
部分用于在DVC缓存(.dvc/cache
)中存储有关目录的信息:(dvc3.7) ➜ repo$ tree .dvc/cache
.dvc/cache
├── 26
│ └── ab0db90d72e28ad0ba1e22ee510510
├── b0
│ └── 26324c6904b2a9cb4b88d6d61c81d1
└── f4
└── 37247ec66d73ba66b0ade0246fcb49.dir
如果使用后缀
.dir
打开文件,则会看到该文件包含当前data
状态的描述:(dvc3.7) ➜ repo$ cat .dvc/cache/f4/37247ec66d73ba66b0ade0246fcb49.dir
[{"md5": "b026324c6904b2a9cb4b88d6d61c81d1", "relpath": "1"},
{"md5": "26ab0db90d72e28ad0ba1e22ee510510", "relpath": "2"}]
如您所见,特定文件(
1
和2
)由该文件中的条目描述更改目录时:
(dvc3.7) ➜ repo$ echo 3 >> data/3
(dvc3.7) ➜ repo$ dvc commit data.dvc
data.dvc
的内容将被更新:outs:
- md5: 12f4b7d54a32e58818e27fba28376fba.dir
path: data
缓存中有一个新文件:
├── 12
│ └── f4b7d54a32e58818e27fba28376fba.dir
...
(dvc3.7) ➜ repo$ cat .dvc/cache/12/f4b7d54a32e58818e27fba28376fba.dir
[{"md5": "b026324c6904b2a9cb4b88d6d61c81d1", "relpath": "1"},
{"md5": "26ab0db90d72e28ad0ba1e22ee510510", "relpath": "2"},
{"md5": "6d7fce9fee471194aa8b5b6e47267f03", "relpath": "3"}]
从git的角度来看,唯一的变化是在
data.dvc
内部。(假设您在添加
git commit
和data
并在其中添加1
后执行了2
):diff --git a/data.dvc b/data.dvc
index 098aec5..88d1a90 100644
--- a/data.dvc
+++ b/data.dvc
@@ -1,6 +1,6 @@
-md5: a427c5bf8680fbf8d1951806b28b82fe
+md5: 1b674d61c195eea7a6b14f176c020b9c
outs:
-- md5: f437247ec66d73ba66b0ade0246fcb49.dir
+- md5: 12f4b7d54a32e58818e27fba28376fba.dir
path: data
cache: true
metric: false
注意:第一个md5对应于此文件的md5,因此必须通过dir更改md5更改
关于version-control - DVC如何将目录级别的差异存储到DVC缓存中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60527213/