在 GitHub 上编辑

内部目录和文件

在项目中初始化后,DVC 会在其安装目录(.dvc/)中生成运行所需的内部目录和文件。

不要与 .dvc 文件混淆。

  • .dvc/config:这是默认的DVC 配置文件。可以通过手动编辑或使用 dvc config 命令进行修改。

  • .dvc/config.local:这是一个可选的、被 Git 忽略的配置文件,其设置会覆盖 .dvc/config 中的选项。当你需要指定敏感信息(如密钥)而这些内容不应提交到 Git 仓库时(例如凭据、私有位置等),此文件非常有用。该配置文件也可以通过手动编辑或使用 dvc config --local 命令进行修改。

    查看更多关于配置文件位置的信息。

  • .dvc/cache缓存目录的默认位置。缓存以特殊的结构存储项目数据。工作区中的数据文件和目录仅包含指向缓存中数据文件的链接(参见大型数据集优化)。有关相关配置选项(包括更改其位置),请参阅 dvc config cache

    请注意,DVC 在初始化期间会将缓存目录添加到 .gitignore 中。任何由 DVC 跟踪的数据都不应推送到 Git 仓库,只有用于下载或重建数据所需的DVC 文件才应纳入版本控制。

  • .dvc/cache/runs运行缓存的默认位置。

  • .dvc/plots图表模板的目录

  • .dvc/tmp:用于存放各种临时文件的目录

  • .dvc/tmp/updater:该文件用于存储 DVC 的最新可用版本。当当前安装版本落后时,用于提醒用户升级。

  • .dvc/tmp/updater.lock.dvc/tmp/updater 的锁文件

  • .dvc/tmp/lock:整个 DVC 项目的锁文件

  • .dvc/tmp/rwlock:包含特定依赖项和输出的读写锁的 JSON 文件,用于支持安全地并行执行多个 DVC 命令

  • .dvc/tmp/exps:该目录将包含用于临时或排队实验的工作区副本。

缓存目录的结构

DVC 缓存是一个基于内容寻址的存储系统(默认位于 .dvc/cache),它在代码和数据之间增加了一层间接层。

根据数据是单个文件还是目录(可能包含多个文件),数据有两种不同的缓存方式。

注意:文件会被重命名和重新组织,目录树在缓存中会被展平,缓存始终只有一层深度,并使用两个字符命名的子目录(基于数据内容的哈希值,如下所述)。

文件

DVC 会计算文件的哈希值,一个长度为 32 个字符的字符串(通常是 MD5)。前两个字符用于命名缓存内的目录,其余部分作为缓存文件的文件名。例如,如果某个数据文件的哈希值为 ec1d2935f811b77cc49b031b999cbf17,那么它在缓存中的路径将是 .dvc/cache/files/md5/ec/1d2935f811b77cc49b031b999cbf17

请注意,文件哈希仅根据文件内容计算。具有不同名称但相同内容的两个或多个文件可以在工作区中共存并由 DVC 跟踪,但缓存中仅存储一个副本。这有助于避免数据重复。

目录

假设我们添加一个包含两张图片的目录:

$ tree data/images/
data/images/
├── cat.jpeg
└── index.jpeg

$ dvc add data/images

生成的缓存目录结构如下所示:

.dvc/cache/
└── files
    └── md5
        ├── 40
        │   └── 2e97968614f583ece3b35555971f64
        ├── 6f
        │   └── db5336fce0dbfd669f83065f107551.dir
        └── de
            └── 7371b0119f4f75f9de703c7c3bac16

目录中的文件被正常缓存。目录本身也会获得一个类似的条目,并带有 .dir 扩展名。该条目包含目录内文件的映射(以 JSON 数组形式),并通过它们的哈希值进行标识:

$ cat .dvc/cache/files/md5/6f/db5336fce0dbfd669f83065f107551.dir
[{"md5": "de7371b0119f4f75f9de703c7c3bac16", "relpath": "cat.jpeg"},
{"md5": "402e97968614f583ece3b35555971f64", "relpath": "index.jpeg"}]

DVC 正是通过这种方式知道另外两个缓存文件属于该目录。

运行缓存

默认情况下,dvc exp rundvc repro 会生成并复用项目中已运行阶段的日志。该日志位于缓存内的 runs/ 目录中(或远程存储中)。

每次运行由确切的依赖项内容(或参数值)以及要执行的具体命令组合来唯一标识。这些组合通过特殊的哈希表示,并对应运行缓存目录中的文件路径:

$ tree .dvc/cache/runs
.dvc/cache/runs
└── 86
    └── 8632e1555283d6e23ec808c9ee1fadc30630c888d5c08695333609ef341508bf
        └── e98a34c44fa6b564ef211e76fb3b265bc67f19e5de2e255217d3900d8f...

这些文件本身是该次运行生成的 dvc.lock 文件的备份。

运行产生的输出则从常规缓存中存储和读取。

使用 --run-cache 标志,dvc pushdvc pull(以及 dvc fetch)可以将运行缓存上传或下载到远程存储,用于共享和/或备份。

运行缓存假设阶段命令是确定性的(参见避免意外行为)。

站点缓存目录

用于存储临时文件的目录。

默认位置:

macOSLinux(典型*)Windows
/Library/Caches/dvc/var/tmp/dvcC:\ProgramData\iterative\dvc

可通过 dvc config core.site_cache_dir 覆盖此位置。

不要与 DVC 缓存混淆。

  • index:用于远程索引文件的目录,旨在优化 dvc pushdvc pulldvc fetchdvc status -c 操作。

  • hashes:此目录用于性能优化。它包含一个 SQLite 状态数据库,用于存储 DVC 项目中被跟踪文件的哈希值,同时保存相应的时间戳和 inode,以避免不必要的文件哈希计算。

  • links:调用 dvc checkout 时用于清理工作区。它包含一个 SQLite 状态数据库,记录了 DVC 创建的所有文件链接(从缓存到工作区)。

内容

🐛 发现问题?告诉我们!或者修复它:

在 GitHub 上编辑

有疑问?加入我们的聊天,我们会为您提供帮助:

Discord 聊天