Al *_*bix 4 database video document mongodb nosql
我在视频服务器上工作,我想使用数据库来保存视频文件。由于我只需要存储带有元数据的简单视频文件,我尝试在 Java 中使用 MongoDB,通过其GridFS机制来存储视频文件及其元数据。
但是,我需要两个主要功能,而我无法使用 MongoDB 进行管理:
我尝试编写简单的代码来做到这一点,但失败了。似乎 MongoDB 不允许对二进制文件进行多线程访问(即使一个线程正在执行所有写入),我也找不到添加到二进制文件的方法 - Java GridFS API 只提供来自已经现有的 GridFSDBFile,我无法获得一个 OutputStream 来写入它。
谢谢,
铝
小智 7
我使用 mongo gridfs 为我们使用 Mongo 构建的消息传递系统存储媒体文件,以便我可以分享我们遇到的问题。
因此,在我针对您的用例场景进行讨论之前,我建议您不要使用 GridFS,而是实际使用类似 Amazon S3(具有用于分段上传的出色休息 api)之类的东西,并将元数据存储在 Mongo 中。这是我们在首次使用 GridFS 实施后在我们的项目中确定的方法。并不是说 GridFS 不好,只是不太适合分块/附加和重写文件的一小部分。有关更多信息,请快速概述 GridFS 的优点和缺点:
http://www.mongodb.org/display/DOCS/When+to+use+GridFS
现在,如果您一心要使用 GridFS,您需要了解驱动程序和读/写并发的工作原理。
在 mongo (2.2) 中,每个模式/数据库都有一个编写器线程。所以这意味着当你在写的时候,你基本上被锁定了,不能让另一个线程执行一个操作。在现实生活中,这非常快,因为在写入块 (256k) 时会产生锁,因此您的读取器线程可以获取一些信息。请查看此并发视频/演示以了解更多详细信息:
http://www.10gen.com/presentations/concurrency-internals-mongodb-2-2
因此,如果您基本上查看我的两个链接,我们可以说问题 2 已得到解答。您还应该对 Mongo 如何写入大型数据集以及页面错误如何为读取器线程提供获取信息的方式有所了解。
现在让我们解决你的第一个问题。Mongo 驱动程序不提供将数据附加到 GridFS 的方法。它是一个火灾/忘记原子类型的操作。但是,如果您了解数据如何以块形式存储以及校验和是如何计算的,那么您可以使用 fs.files 和 fs.chunks 方法手动执行此操作,正如本海报在此处讨论的那样:
因此,通过这些,您可以看到可以做您想做的事,但我的一般建议是使用专为此类交互设计的服务(例如 Amazon S3),而不是尝试做额外的工作来使 Mongo 适合您的需求。当然,您也可以直接转到文件系统,这将是穷人的选择,但是您会失去使用 GridFS 或 S3 获得的冗余、分片、复制等。
希望有帮助。
-普拉西