mongodb - 如何使用 MongoDB 或其他文档数据库保存视频文件,可选择添加到现有二进制文件和并行读/写

标签 mongodb video document database nosql

我在视频服务器上工作,我想使用数据库来保存视频文件。 由于我只需要存储带有元数据的简单视频文件,因此我尝试通过其 GridFS 在 Java 中使用 MongoDB。存储视频文件及其元数据的机制。

但是,有两个主要功能是我需要的,但我无法使用 MongoDB 来管理:

  1. 我希望能够添加到以前保存的视频中,因为保存视频可能会分块执行。我不想删除我目前拥有的二进制文件,只需在项目末尾附加字节即可。
  2. 我希望能够在正在编写的视频项中读取它。 “线程 A”将更新视频项目,添加越来越多的字节,而“线程 B”将从项目中读取,并在写入/刷新后立即接收“线程 A”写入的所有字节。

我尝试编写简单的代码来做到这一点,但失败了。似乎 MongoDB 不允许对二进制文件进行多线程访问(即使一个线程正在执行所有写入),我也找不到添加到二进制文件的方法 - Java GridFS API 只提供一个 InputStream 来自已经现有的 GridFSDBFile,我无法让 OutputStream 写入它。

  • 这可以通过 MongoDB 实现吗?如果可以,怎么做?
  • 如果没有,您是否知道任何其他可能允许这样做的数据库(最好不要太复杂,例如完整的关系数据库)?
  • 我是否最好使用 MongoDB 只保留视频文件的元数据,并手动处理从文件系统读取和写入二进制数据,这样我就可以自己实现上述要求?

谢谢,

最佳答案

我使用 mongo gridfs 为我们使用 Mongo 构建的消息传递系统存储媒体文件,这样我就可以分享我们遇到的问题。

因此,在我针对您的用例场景进行介绍之前,我建议您不要使用 GridFS,而应实际使用 Amazon S3(具有用于分段上传的出色 rest api)之类的东西,并将元数据存储在 Mongo 中。这是我们在首次使用 GridFS 实现后在项目中确定的方法。这并不是说 GridFS 不好,它只是不太适合分块/追加和重写文件的一小部分。有关更多信息,请快速了解 GridFS 的优点和缺点:

http://www.mongodb.org/display/DOCS/When+to+use+GridFS

现在,如果您打算使用 GridFS,则需要了解驱动程序和读/写并发的工作原理。

在 mongo (2.2) 中,每个模式/数据库有一个编写器线程。因此,这意味着当您编写时,您基本上无法让另一个线程执行操作。在现实生活中,这是非常快的,因为当写入一个 block (256k)时锁会产生,所以你的读者线程可以得到一些信息。请查看此并发视频/演示文稿以了解更多详细信息:

http://www.10gen.com/presentations/concurrency-internals-mongodb-2-2

因此,如果您从本质上看我的两个链接,我们可以说问题 2 已得到解答。您还应该了解一点有关 Mongo 如何编写大型数据集以及页面错误如何为读取器线程提供获取信息的方法。

现在让我们来解决您的第一个问题。 Mongo 驱动程序不提供将数据附加到 GridFS 的方法。它是一个 fire/forget 原子类型的操作。但是,如果您了解数据如何存储在 block 中以及如何计算校验和,那么您可以使用 fs.files 和 fs.chunks 方法手动执行此操作,正如此海报在此处讨论的那样:

Append data to existing gridfs file

因此,通过这些你可以看到可以做你想做的事,但我的一般建议是使用专为此类交互设计的服务(如 Amazon S3),而不是尝试做额外的工作来让 Mongo 满足您的需求。当然,您也可以直接访问文件系统,这将是穷人的选择,但您会失去通过 GridFS 或 S3 获得的冗余、分片、复制等。

希望对您有所帮助。

-普拉斯

关于mongodb - 如何使用 MongoDB 或其他文档数据库保存视频文件,可选择添加到现有二进制文件和并行读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13012444/

相关文章:

arrays - Linux 控制台中的 MongoDB 命令带有 --eval (print

java - 更快地读取文件

javascript - MongoDB 存储正确的日期但在 View (EJS)上未正确显示

node.js - 更新嵌套树中的后代 mongoDB、node.js

swift - AV 视频 URL 在内存中保留多长时间?

iphone - 在iPhone SDK中查找带有通配符的文件名

javascript - 在特定鼠标移动时播放 slider 上的多个视频

jquery - 预加载 ="none"不适用于 ie8

javascript - 文档.activeElement

ios - 将应用程序资源放入iOS的文档目录中