9

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

我一直在寻找一些 $append_bytes 和 $replace_bytes 类型的修饰符,但似乎我能做的最好的就是 $push 用于数组。如果我能够以某种方式访问​​磁盘上的底层 bson,这似乎可以通过执行 seek-write 类型操作来实现,但在我看来,在 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 行为和存储之间进行很好的集成。

4

1 回答 1

4

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

何时使用 GridFS可能对您有用

于 2012-06-17T09:12:51.303 回答