如何从 Oracle 访问 DVC 控制的文件?
How to access DVC-controlled files from Oracle?
我一直将我的大文件存储在 Oracle 中的 CLOB 中,但我正在考虑将我的大文件存储在共享驱动器中,然后让 Oracle 中的列包含指向这些文件的指针。这将使用 DVC。
当我这样做时,
(a) Oracle 路径中的路径是否指向我的共享驱动器中的文件,如实际文件本身?
(b) 或者 Oracle 中的路径是否以某种方式指向 DVC 图元文件?
任何见解都会帮助我!
谢谢:)
贾斯汀
编辑以提供更清晰的信息:
我在这里查看了 (https://dvc.org/doc/api-reference/open),这很有帮助,但我还没有完全做到...
我想使用 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' 参数:
在我的问题之前,一些 background/my 设置:
(a) 我的 MacBook 上有一个名为 'basics' 的存储库。
(b) 我将包含 501 个文件(称为 'surface_files')的目录复制到 'basics',随后将其推送到名为 'gss' 的远程存储文件夹。推送后'gss'包含220个hash目录
我之前到这里的步骤如下:
> 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_100141.dat
,并使用dvc.api.get_url()
获取相应的远程存储文件姓名。然后,我将此远程存储文件复制到我的桌面,并使用文件的原始名称,即 surface_100141.dat
.
完成所有这一切的代码如下,但首先,我的问题 --- 当我 运行 代码如下所示时,没有问题;但是当我取消注释 'rev=' 行时,它失败了。我不确定为什么会这样。我使用 git log
和 cat .git/refs/heads/master
来确保我获得了正确的哈希值。为什么会失败?这是我的问题。
(坦白说,我的 git 知识还不是太丰富。我已经到了,但它仍在进行中!:))
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
我不是 100% 确定我理解这个问题(最好在您尝试使用此数据库解决的实际用例上稍微扩展一下),但我可以分享一些想法。
当我们谈论 DVC 时,我认为您需要指定一些东西来识别 file/directory:
- Git 提交 + 路径(实际路径如
data/data/xml
)。需要提交(或准确地说是任何 Git 修订)来识别数据文件的版本。
- 或者DVC存储中的路径(
/mnt/shared/storage/00/198493ef2343ao
...) + actual name of this file. This way you would be saving info that
.dvc`文件有.
我会说第二种方法不推荐,因为在某种程度上它是一个实现细节——DVC 如何在内部存储文件。 DVC 组织数据存储的 public 接口是其存储库 URL + 提交 + 文件名。
编辑(示例):
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
location/of/dvc/project
此路径必须指向实际的 Git 存储库。这个 repo 应该有一个 .dvc
或 dvc.lock
文件,其中包含 activity.log
名称 + 它在远程存储中的哈希值:
outs:
- md5: a304afb96060aad90176268345e10355
path: activity.log
通过阅读此 Git 回购和分析,假设 activity.log.dvc
DVC 将能够创建正确的路径 s3://my-bucket/storage/a3/04afb96060aad90176268345e10355
remote='my-s3-bucket'
参数是可选的。默认情况下,它将使用在 repo 本身中定义的那个。
再举一个真实的例子:
with dvc.api.open(
'get-started/data.xml',
repo='https://github.com/iterative/dataset-registry'
) as fd:
for line in fd:
match = re.search(r'user=(\w+)', line)
# ... Process users activity log
在 https://github.com/iterative/dataset-registry
你可以找到 .dvc
file that is enough for DVC to create a path to the file by also analyzing its config
https://remote.dvc.org/dataset-registry/a3/04afb96060aad90176268345e10355
您可以 运行 wget
下载此文件
我一直将我的大文件存储在 Oracle 中的 CLOB 中,但我正在考虑将我的大文件存储在共享驱动器中,然后让 Oracle 中的列包含指向这些文件的指针。这将使用 DVC。
当我这样做时,
(a) Oracle 路径中的路径是否指向我的共享驱动器中的文件,如实际文件本身?
(b) 或者 Oracle 中的路径是否以某种方式指向 DVC 图元文件?
任何见解都会帮助我!
谢谢:) 贾斯汀
编辑以提供更清晰的信息:
我在这里查看了 (https://dvc.org/doc/api-reference/open),这很有帮助,但我还没有完全做到...
我想使用 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' 参数:
在我的问题之前,一些 background/my 设置: (a) 我的 MacBook 上有一个名为 'basics' 的存储库。 (b) 我将包含 501 个文件(称为 'surface_files')的目录复制到 'basics',随后将其推送到名为 'gss' 的远程存储文件夹。推送后'gss'包含220个hash目录
我之前到这里的步骤如下:
> 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_100141.dat
,并使用dvc.api.get_url()
获取相应的远程存储文件姓名。然后,我将此远程存储文件复制到我的桌面,并使用文件的原始名称,即 surface_100141.dat
.
完成所有这一切的代码如下,但首先,我的问题 --- 当我 运行 代码如下所示时,没有问题;但是当我取消注释 'rev=' 行时,它失败了。我不确定为什么会这样。我使用 git log
和 cat .git/refs/heads/master
来确保我获得了正确的哈希值。为什么会失败?这是我的问题。
(坦白说,我的 git 知识还不是太丰富。我已经到了,但它仍在进行中!:))
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
我不是 100% 确定我理解这个问题(最好在您尝试使用此数据库解决的实际用例上稍微扩展一下),但我可以分享一些想法。
当我们谈论 DVC 时,我认为您需要指定一些东西来识别 file/directory:
- Git 提交 + 路径(实际路径如
data/data/xml
)。需要提交(或准确地说是任何 Git 修订)来识别数据文件的版本。 - 或者DVC存储中的路径(
/mnt/shared/storage/00/198493ef2343ao
...) + actual name of this file. This way you would be saving info that
.dvc`文件有.
我会说第二种方法不推荐,因为在某种程度上它是一个实现细节——DVC 如何在内部存储文件。 DVC 组织数据存储的 public 接口是其存储库 URL + 提交 + 文件名。
编辑(示例):
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
location/of/dvc/project
此路径必须指向实际的 Git 存储库。这个 repo 应该有一个 .dvc
或 dvc.lock
文件,其中包含 activity.log
名称 + 它在远程存储中的哈希值:
outs:
- md5: a304afb96060aad90176268345e10355
path: activity.log
通过阅读此 Git 回购和分析,假设 activity.log.dvc
DVC 将能够创建正确的路径 s3://my-bucket/storage/a3/04afb96060aad90176268345e10355
remote='my-s3-bucket'
参数是可选的。默认情况下,它将使用在 repo 本身中定义的那个。
再举一个真实的例子:
with dvc.api.open(
'get-started/data.xml',
repo='https://github.com/iterative/dataset-registry'
) as fd:
for line in fd:
match = re.search(r'user=(\w+)', line)
# ... Process users activity log
在 https://github.com/iterative/dataset-registry
你可以找到 .dvc
file that is enough for DVC to create a path to the file by also analyzing its config
https://remote.dvc.org/dataset-registry/a3/04afb96060aad90176268345e10355
您可以 运行 wget
下载此文件