gpt4 book ai didi

mongodb - 如何在 Mongodb 中高效地存储和更新二进制数据?

转载 作者:太空狗 更新时间:2023-10-30 01:45:05 25 4
gpt4 key购买 nike

我正在文档中存储一个大型二进制数组。我希望不断向这个数组添加字节,有时更改现有字节的值。

我一直在寻找一些 $append_bytes 和 $replace_bytes 类型的修饰符,但看来我能做的最好的就是 $push 数组。如果我能以某种方式访问​​磁盘上的底层 bson,这似乎可以通过执行寻-写类型操作来实现,但在我看来,在 mongodb 中无论如何都无法做到这一点(并且可能有充分的理由)。

如果我只是查询这个二进制数组,对其进行编辑或添加,然后通过重写整个字段来更新文档,这会有多大代价?每个二进制数组的大小约为 1-2MB,每 5 分钟更新一次,涉及 1000 多个文档。更糟糕的是,没有简单的方法(及时)将它们分散开来,它们通常会以 5 分钟的间隔彼此靠近发生。有没有人预感到这将是多么灾难性的后果?好像会有问题。

另一种方法是将此二进制数据作为单独的文件存储在磁盘上,实现线程池以有效地操作磁盘上的文件,并从我的 mongodb 文档中引用文件名。 (我正在使用 python 和 pymongo,所以我在看 pytables)。如果可能的话,我宁愿避免这种情况。

我在这里忽略了任何其他选择吗?

提前致谢

编辑

在为我的用例编写一些测试后,我决定为二进制数据对象使用一个单独的文件系统(特别是使用 pytables 或 h5py 的 hdf5)。除了这些二进制数据对象的持久性之外,我仍然会使用 mongo 来处理所有事情。通过这种方式,我可以将与附加和更新类型操作相关的性能与我的基本 mongo 性能分离。

其中一位 mongo 开发人员确实指出我可以使用点符号和 $set 设置内部数组元素(请参阅下面评论中的 ref),但此时无法以原子方式在数组中执行一系列集合.

此外 - 如果我的 mongo 文档中有 1,000 个 2MB 的二进制数据字段并且我经常更新和增加它们(至少每 5 分钟一次) - 我的直觉告诉我 mongo 将不得不管理磁盘上文件中的许多分配/增长问题 - 最终这将导致性能问题。我宁愿将其卸载到操作系统级别的单独文件系统来处理。

最后 - 我将使用 numpy 对我的数据进行操作和计算 - pytables 和 h5py 模块都允许 numpy 行为和存储之间的良好集成。

最佳答案

正如您所提到的,您经常编辑二进制数据,实际上非常频繁。 GridFS 是我建议的另一种选择。

When to use GridFS可能对你有用

关于mongodb - 如何在 Mongodb 中高效地存储和更新二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11069905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com