2

我是 DVC 的新手,到目前为止,我喜欢我所看到的。但可能我的问题很容易回答。

我的问题:我们如何正确跟踪派生数据项目中原始hugedatarepo(假设这也可以改变)中文件的依赖关系,但是在签出派生数据时通常不导入大文件?我不认为我可以dvc import用来实现这一点。

详细信息:我们有一个包含大量非常大的数据文件(扫描)的存储库,并使用这些数据来设计和训练各种算法。通常我们只想使用特定文件,甚至只是文件中的小块用于训练、注释等。也就是说,我们为特定任务获取数据,我们希望将其放入新的存储库中。

目前我的想法是对dvc get相关数据,将其放在一个未跟踪的临时文件夹中,然后再次使用 dvc 管理派生数据。但仍然要依赖原始数据。

hugeFileRepo
 +metaData.csv
 +dataFolder
 +-- hugeFile_1
 ...
 +-- hugeFile_n

在派生数据存储库中我做

 dvc import hugeFileRepo.git metaData.csv
 dvc run -f derivedData.dvc \
    -d metaData.csv \
    -d deriveData.py \
    -o derivedDataFolder \
    python deriveData.py 

我的 derivedData.py 做了一些事情(伪代码)

metaData = read(metaData.csv)

#Hack because I don't know how to it right:
gitRevision = getGitRevision(metaData.csv.dvc)          
...
for metaDataForFile, file in metaData:
   if(iWantFile(metaDataForFile) ):
      #download specific file
      !dvc get --rev {gitRevision} -o tempFolder/{file} hugeFileRepo.git {file}

      #do processing of huge file and store result in derivedDataFolder
      processAndWrite(tempFolder/file)

所以我使用元数据文件作为实际数据的代理。hugeFileRepo 数据不会频繁更改,metaData 文件将保持最新。而且我完全可以依赖一般数据而不是我使用的实际文件。所以我相信这个解决方案对我有用,但我相信有更好的方法。

4

1 回答 1

1

这不是一个非常具体的答案,因为我不确定我是否完全理解细节和设置,但总的来说这里有一些想法:

我们有一个包含大量非常大的数据文件(扫描)的存储库......通常我们只想使用特定文件,甚至只使用小块

接受目标数据文件的 DVC 命令应该支持粒度(参见https://github.com/iterative/dvc/issues/2458),这意味着您只能从跟踪目录导入特定文件。至于块,DVC 无法仅从 CLI 导入文件的某些部分,这需要对所有可能的数据格式进行语义理解。

我们为特定任务获取数据

将此步骤视为适当的 DVC 阶段derivedData.dvc( )。

由于您使用的是 Python,因此有一个 API 可以在运行时打开在线 DVC 存储库中的数据并将数据直接流式传输到您的程序中,因此deriveData.py可以这样做,而无需事先导入或下载任何内容。请参阅https://dvc.org/doc/api-reference


抱歉,我不认为我理解与使用 git 修订的最后一个代码示例的主要问题的意图或关系。

于 2020-05-15T18:24:54.810 回答