我在文档中存储一个大的二进制数组.我希望不断向此数组添加字节,有时会更改现有字节的值.
我正在寻找一些$ 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行为和商店之间的良好集成.
我正在从http服务器下载文件,并且必须考虑到在下载期间的随机点,网络连接失败或计算机崩溃.如果发生这种情况,我会使用HTTP"Range:"标题开始恢复下载.
由于下载必须针对MD5哈希进行验证,因此我似乎无法在恢复后使用网络输入流来获取正确的哈希,因为java.security.MessageDigest似乎没有基本上说"从我之前下载的部分md5哈希开始更新当前的md5哈希".
我对md5的内部不太熟悉 - 这在理论上是否可行,是否有一个可以让我这样做的库?
从下载的文件计算md5哈希将是非常昂贵的性能.
我在视频服务器上工作,我想使用数据库来保存视频文件。由于我只需要存储带有元数据的简单视频文件,我尝试在 Java 中使用 MongoDB,通过其GridFS机制来存储视频文件及其元数据。
但是,我需要两个主要功能,而我无法使用 MongoDB 进行管理:
我尝试编写简单的代码来做到这一点,但失败了。似乎 MongoDB 不允许对二进制文件进行多线程访问(即使一个线程正在执行所有写入),我也找不到添加到二进制文件的方法 - Java GridFS API 只提供来自已经现有的 GridFSDBFile,我无法获得一个 OutputStream 来写入它。
谢谢,
铝