访问 Mongodb 中的文件

Accessing files in Mongodb

我在 python 中使用 sacred 包,这样可以跟踪我在 运行 中的计算实验。 sacred 允许添加观察者(mongodb),它存储关于实验的各种信息(configurationsource files 等)。 sacred 允许使用 sacred.Experiment.add_artifact(PATH_TO_FILE).

将工件添加到数据库 bt

此命令本质上是将文件添加到数据库中。

我正在使用 MongoDB 指南针,我可以访问实验信息并看到已添加一个工件。它包含两个字段: 'name' 和 'file_id' 其中包含一个 ObjectId。 (见图)

我正在尝试访问存储的文件本身。我注意到在我的数据库下还有一个名为 fs.files 的额外 sub-db 我可以过滤以找到我的 ObjectId 但它似乎不允许我访问文件的内容本身。

MongoDB 文件存储由 "GridFS" 处理,它基本上将文件分成块并将它们存储在一个集合中 (fs.files)。

访问教程:http://api.mongodb.com/python/current/examples/gridfs.html

GridFS (import gridfs, pymongo)

的代码示例

如果您已经拥有 ObjectId:

artifact = gridfs.GridFS(pymongo.MongoClient().sacred)).get(objectid)

为名为 filename 的工件查找 ObjectId,其中 result 作为 db.runs.find 的一个条目:

objectid = next(a['file_id'] for a in result['artifacts'] if a['name'] == filename)

我编写了一个名为 incense 的小型库来访问通过 sacred 存储的 MongoDB 中的数据。它可以在 GitHub at https://github.com/JarnoRFB/incense 上和通过 pip 获得。有了它,您可以将实验加载为 Python 个对象。这些工件将作为对象提供,您可以再次将其保存在磁盘上或显示在 Jupyter 笔记本中

from incense import ExperimentLoader

loader = ExperimentLoader(db_name="my_db")
exp = loader.find_by_id(1)
print(exp.artifacts)
exp.artifacts["my_artifact"].save()  # Save artifact on disk.
exp.artifacts["my_artifact"].render()  # Display artifact in notebook.