有人可以解释 DVC 如何将目录级别的差异存储到 DVC 缓存中。
我了解 DVC 文件 (.dvc) 是用于跟踪数据、模型和重现管道阶段的元文件。但是,我不清楚创建分支、提交它们并切换回主文件的过程是如何准确保存在差异中的。
有人可以解释 DVC 如何将目录级别的差异存储到 DVC 缓存中。
我了解 DVC 文件 (.dvc) 是用于跟踪数据、模型和重现管道阶段的元文件。但是,我不清楚创建分支、提交它们并切换回主文件的过程是如何准确保存在差异中的。
精简版:
.dvc文件包含有关缓存内描述目录当前状态的 JSON 文件的信息 (md5)。
当目录更新时,文件中有新的 md5,.dvc并使用更新的目录状态创建新的 JSON 文件。
在 git 中,您存储 .dvc文件,以便 DVC 知道(基于 md5)在哪里查找有关目录的信息。
更长的版本:
让我尝试打破使用 DVC 处理目录的特定步骤。
data
├── 1
└── 2
dvc add dataDVC 跟踪您的目录。结果,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 的角度来看,唯一的变化是 inside data.dvc。(假设你git commit在添加datawith1和2inside 之后做了):
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 change 而改变