外部数据
若要对位于本地项目之外的数据进行版本管理,可以将其导入。你可以选择是否下载该数据,以及是否将副本推送到你的DVC 远程存储。即使你希望在原始源位置就地跟踪数据,这种导入方式仍然很有用。
如果你想在管道中使用外部数据,请参阅外部依赖项和输出。
导入外部数据的工作原理
使用import-url
导入外部数据:
$ dvc import-url https://data.dvc.org/get-started/data.xml
Importing 'https://data.dvc.org/get-started/data.xml' -> 'data.xml'
这会将文件下载到data.xml
(如果想跳过此步骤,请参见避免重复)。同时会创建data.xml.dvc
文件,用于跟踪源数据。
.dvc
文件# ...
deps:
- etag: '"f432e270cd634c51296ecd2bc2f5e752-5"'
path: https://data.dvc.org/get-started/data.xml
outs:
- md5: a304afb96060aad90176268345e10355
path: data.xml
cache: true
persist: false
DVC 会检查服务器返回的头部信息,查找HTTP ETag或Content-MD5头部,并利用它判断源数据是否已更改,从而决定是否需要重新下载文件。
要检查源位置是否有更新,请运行dvc update
:
$ dvc update data.xml.dvc
'data.xml.dvc' didn't change, skipping
在执行dvc push
时,DVC 会将data.xml.dvc
所跟踪的数据版本上传到DVC 远程存储,以便备份,以防将来需要恢复。
DVC 永远不会覆盖数据的源位置。相反,DVC 可以在本地检出该数据的任意版本。DVC 的设计目的是保护原始数据,防止意外覆盖或发生其他用户未预料到的更改,因此你可以在不丢失当前源位置所存内容的前提下恢复旧版本。
避免重复
在某些情况下,复制外部数据可能是不必要的或不切实际的,例如当你的数据太大而无法本地下载,或者你直接从源位置流式读取数据,又或者你已经使用云版本控制来备份旧版本。
使用--no-download
选项可在导入或更新数据时跳过下载步骤。DVC 会将元数据保存在data.xml.dvc
中,但不会在本地下载data.xml
:
$ dvc import-url --no-download https://data.dvc.org/get-started/data.xml
Importing 'https://data.dvc.org/get-started/data.xml' -> 'data.xml'
$ ls
data.xml.dvc
之后若要恢复此版本的数据,可使用dvc pull
,DVC 将尝试从其原始源位置下载数据。然而,如果你已覆盖了原始源数据,dvc pull
可能会失败。为了能够恢复任意版本的数据,你可以将数据推送到DVC 远程存储,或使用云版本控制。
示例:推送到远程
dvc import-url --to-remote
不会在本地下载数据,而是直接将数据推送到DVC 远程存储:
$ dvc import-url --to-remote https://data.dvc.org/get-started/data.xml
$ ls
data.xml.dvc
$ dvc push
Everything is up to date.
示例:云版本控制
如果从支持的云版本控制提供商导入数据,使用dvc import-url --no-download --version-aware
将不会在本地下载数据,而是跟踪云提供商为数据分配的版本 ID。dvc pull
会尝试下载这些版本 ID(只要它们仍然可用)。dvc push
不会上传任何内容,因为 DVC 假定这些版本在源位置始终可用:
$ dvc import-url --no-download --version-aware s3://myversionedbucket/data.xml
Importing 's3://myversionedbucket/data.xml' -> 'data.xml'
$ ls
data.xml.dvc
$ dvc push
Everything is up to date.