我在文档中存储一个大的二进制数组。我希望不断向这个数组添加字节,有时会改变现有字节的值。
我正在寻找一些$ 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行为和商店之间的良好集成。