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

时间:2012-06-17 08:19:07

标签: mongodb database

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

我正在寻找一些$ append_bytes和$ replace_bytes类型的修饰符,但看起来我能做的最好的就是$ push for arrays。看起来这可以通过执行搜索 - 写入类型操作来实现,如果我以某种方式访问​​磁盘上的底层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将不得不管理磁盘上的文件中有很多分配/增长问题 - 这最终会导致性能问题。我宁愿将其加载到OS级别的单独文件系统来处理。

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

1 个答案:

答案 0 :(得分:4)

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

When to use GridFS可能对您有用