派生数据的 DVC 依赖项,无需导入



我是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 

我的 deriveData.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)

所以我使用元数据文件作为实际数据的代理。庞大的文件存储库数据不会经常更改,元数据文件将保持最新。而且我绝对可以依赖一般数据而不是我使用的实际文件。所以我相信这个解决方案对我有用,但我相信有更好的方法。

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

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

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

我们为特定任务获取数据

将此步骤视为适当的DVC阶段(derivedData.dvc(似乎是最好的方法,并且此阶段取决于完整的原始数据文件(同样,DVC无法事先知道源代码将实际使用数据的哪些部分(。

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


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