Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Oracle访问DVC控制的文件?_Python_Oracle_Dvc - Fatal编程技术网

Python 如何从Oracle访问DVC控制的文件?

Python 如何从Oracle访问DVC控制的文件?,python,oracle,dvc,Python,Oracle,Dvc,我一直在Oracle中以CLOB存储我的大文件,但我正在考虑将我的大文件存储在共享驱动器中,然后在Oracle中设置一个列,其中包含指向这些文件的指针。这将使用DVC 当我这样做的时候 (a) Oracle路径中指向共享驱动器中文件的路径是否与实际文件本身相同 (b) 或者Oracle中的路径是否以某种方式指向DVC元文件 任何洞察都会帮助我的 谢谢:) 贾斯汀 编辑以提供更清晰的信息: 我检查了这里(),这很有帮助,但我还没有完全做到 我想使用python(我已经连接到Oracle数据库)从

我一直在Oracle中以CLOB存储我的大文件,但我正在考虑将我的大文件存储在共享驱动器中,然后在Oracle中设置一个列,其中包含指向这些文件的指针。这将使用DVC

当我这样做的时候

(a) Oracle路径中指向共享驱动器中文件的路径是否与实际文件本身相同

(b) 或者Oracle中的路径是否以某种方式指向DVC元文件

任何洞察都会帮助我的

谢谢:) 贾斯汀


编辑以提供更清晰的信息:

我检查了这里(),这很有帮助,但我还没有完全做到

我想使用python(我已经连接到Oracle数据库)从远程dvc存储库中提取一个文件。所以,如果我们能做到这一点,我想我会很好。但是,我很困惑。如果我在下面指定“remote”,那么当远程文件都被编码时,我如何命名该文件(例如,“activity.log”)

with dvc.api.open(
        'activity.log',
        repo='location/of/dvc/project',
        remote='my-s3-bucket'
        ) as fd:
    for line in fd:
        match = re.search(r'user=(\w+)', line)
        # ... Process users activity log
(注意:出于测试目的,我的“远程”DVC目录只是MacBook上的另一个文件夹。)

我觉得我错过了获取远程文件的一个关键概念

我希望这能增加更多的清晰度。任何关于远程文件访问的帮助都将不胜感激!:)

贾斯汀


编辑以了解“rev”参数:

在我提问之前,请先了解一些背景/我的设置: (a) 我的MacBook上有一个名为“基础”的回购协议。 (b) 我将包含501个文件(称为“surface_文件”)的目录复制到“basics”中,然后将其推送到一个名为“gss”的远程存储文件夹中。推送之后,“gss”包含220个哈希目录

我在这里使用的步骤如下:

> cd ~/Desktop/Work/basics
> git init
> dvc init
> dvc add ~/Desktop/Work/basics/surface_files
> git add .gitignore surface_files.dvc
> git commit -m "Add raw data"
> dvc remote add -d remote_storage ~/Desktop/Work/gss
> git commit .dvc/config -m "Configure remote storage"
> dvc push
> rm -rf ./.dvc/cache
> rm -rf ./surface_files
接下来,我运行了以下Python代码以获取一个名为
surface\u 100141.dat
的surface文件,并使用
dvc.api.get\u url()
获取相应的远程存储文件名。然后,我将这个远程存储文件以文件的原始名称(即
surface_100141.dat
)复制到我的桌面上

完成这一切的代码如下所示,但首先,我的问题是——当我按如下所示运行代码时,没有问题;但是当我取消注释'rev='行时,它失败了。我不知道为什么会这样。我使用了
git log
cat.git/refs/heads/master
来确保得到了正确的哈希值。为什么会失败?这是我的问题

(充分披露,我的git知识还不太强。我正在努力,但这仍然是一项正在进行的工作!)


我不能100%确定我是否理解这个问题(最好在您试图用这个数据库解决的实际用例上进行一些扩展),但我可以分享一些想法

当我们谈论DVC时,我认为您需要指定一些东西来标识文件/目录:

  • Git提交+路径(实际路径,如
    data/data/xml
    )。确认数据文件的版本需要提交(确切地说是任何Git版本)
  • 或DVC存储器中的路径(
    /mnt/shared/storage/00/198493ef2343ao
    )+此文件的实际名称。这样,您就可以保存
    .dvc`文件中包含的信息
  • 我想说的是,不推荐第二种方法,因为在某种程度上这是一个实现细节——DVC如何在内部存储文件。DVC有组织数据存储的公共接口是其存储库URL+提交+文件名

    编辑(示例):

    使用dvc.api.open(
    “activity.log”,
    repo='location/of/dvc/project',
    远程class='my-s3-bucket'
    )作为fd:
    对于fd中的行:
    匹配=重新搜索(r'user=(\w+),行)
    # ... 进程用户活动日志
    
    location/of/dvc/project
    此路径必须指向实际的Git回购。此repo应具有
    .dvc
    dvc.lock
    文件,其中包含
    活动.log
    名称+其在远程存储中的哈希:

    out:
    -md5:a304afb96060aad90176268345e10355
    路径:activity.log
    
    通过阅读此Git回购协议并进行分析,比如说
    activity.log.dvc
    dvc将能够创建正确的路径
    s3://my bucket/storage/a3/04afb96060aad90176268345e10355

    remote='my-s3-bucket'
    参数是可选的。默认情况下,它将使用回购协议中定义的协议

    让我们再举一个真实的例子:

    使用dvc.api.open(
    “get started/data.xml”,
    回购协议https://github.com/iterative/dataset-registry'
    )作为fd:
    对于fd中的行:
    匹配=重新搜索(r'user=(\w+),行)
    # ... 进程用户活动日志
    
    https://github.com/iterative/dataset-registry
    您可以通过分析文件的路径,找到足以让DVC创建文件路径的路径


    您可以在此文件上运行
    wget
    来下载它

    文件通常存储在
    BLOB
    列中,而不是
    CLOB
    列中,除非文件是纯文本,如果客户端碰巧请求了与数据库不同的字符集,则不会受到字符集转换之类的影响。当您说您正在考虑存储指向文件的指针时,您是指
    BFILE
    列(它只是对文件系统路径的引用)?或者您正在谈论一个
    VARCHAR2
    列,其中存储了一个路径字符串?谢谢,@Shcheklein:)请参阅我上面的编辑,提供更多详细信息:)@Justin谢谢!我已经用一些细节更新了答案。如果仍然不清楚,请告诉我,您需要更多信息。再次感谢,@Shcheklein:)在玩了这个之后,我想我有了一些有用的东西——除了一个例外——我还没有成功使用
    dvc.api.get\u url()
    rev=
    参数,所以我不知道如何指定正确的提交。如果可以的话,你能看看我最新编辑的原创文章吗?我已经展示了我的所有步骤,希望你能帮助我明白为什么我没有使用
    import dvc.api
    import os.path
    from os import path
    import shutil
    
    filename = 'surface_100141.dat' # This file name would be stored in my Oracle database
    home_dir = os.path.expanduser('~')+'/' # This simply expanding '~' into '/Users/ricej/'
    
    resource_url = dvc.api.get_url(
        path=f'surface_files/{filename}', # Works when 'surface_files.dvc' exists, even when 'surface_files' directory and .dvc/cache do not
        repo=f'{home_dir}Desktop/Work/basics',
        # rev='5c92710e68c045d75865fa24f1b56a0a486a8a45', # Commit hash, found using 'git log' or 'cat .git/refs/heads/master'
        remote='remote_storage')
    resource_url = home_dir+resource_url
    print(f'Remote file: {resource_url}')
    
    new_dir = f'{home_dir}Desktop/' # Will copy fetched file to desktop, for demonstration
    new_file = new_dir+filename
    print(f'Remote file copy: {new_file}')
    
    if path.exists(new_file):
        os.remove(new_file)
        
    dest = shutil.copy(resource_url, new_file) # Check your desktop after this to see remote file copy
    
    https://remote.dvc.org/dataset-registry/a3/04afb96060aad90176268345e10355