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

如何使用MongoDB或其他文档数据库保存视频文件,包括添加到现有二进制文件和并行读/写选项,mongodb,video,document,database,nosql,Mongodb,Video,Document,Database,Nosql,我在一个视频服务器上工作,我想用一个数据库来保存视频文件。 因为我只需要用元数据存储简单的视频文件,所以我尝试在Java中使用MongoDB,通过它的机制来存储视频文件及其元数据 但是,我需要两个主要功能,而我无法使用MongoDB管理这两个功能: 我希望能够添加到以前保存的视频中,因为保存视频可能会分块执行。我不想删除到目前为止的二进制文件,只需在项目的末尾追加字节 我希望能够从正在编写的视频项目中读取。“线程A”将更新视频项目,添加越来越多的字节,而“线程B”将从该项目中读取,在写入/刷新“

我在一个视频服务器上工作,我想用一个数据库来保存视频文件。 因为我只需要用元数据存储简单的视频文件,所以我尝试在Java中使用MongoDB,通过它的机制来存储视频文件及其元数据

但是,我需要两个主要功能,而我无法使用MongoDB管理这两个功能:

  • 我希望能够添加到以前保存的视频中,因为保存视频可能会分块执行。我不想删除到目前为止的二进制文件,只需在项目的末尾追加字节
  • 我希望能够从正在编写的视频项目中读取。“线程A”将更新视频项目,添加越来越多的字节,而“线程B”将从该项目中读取,在写入/刷新“线程A”写入的所有字节后立即接收它们
  • 我尝试编写简单的代码来实现这一点,但失败了。MongoDB似乎不允许对二进制文件进行多线程访问(即使一个线程正在执行所有写入操作),我也找不到添加到二进制文件的方法-Java GridFS API只提供来自已存在的GridFSDBFile的InputStream,我无法获得要写入它的OutputStream

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


    Al

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

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

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

    在mongo(2.2)中,每个schema/db有一个writer线程。因此,这意味着当您在编写时,您实际上被锁定,无法让另一个线程执行操作。在现实生活中,这是非常快的,因为在写入块(256k)时会产生锁,因此您的读线程可以获得一些信息。有关更多详细信息,请查看此并发视频/演示文稿:

    所以,如果你看我的两个链接,我们可以说问题2得到了回答。您还应该了解一下Mongo是如何编写大型数据集的,以及页面错误是如何为读者线程提供获取信息的方法的

    现在让我们来回答你的第一个问题。Mongo驱动程序不提供将数据附加到GridFS的方法。这意味着是一个火/忘记原子类型的操作。但是,如果您了解数据是如何存储在块中的,以及校验和是如何计算的,那么您可以使用本海报所述的fs.files和fs.chunks方法手动执行此操作:

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

    希望有帮助


    -Prasith

    您还需要在gridfs之外缓冲视频。不确定视频播放器如何以顺序方式从二进制文件的一端读取到另一端(因为字节可能分散在文件磁盘空间中,只有当您拥有整个文件时,您才能理解视频)但如果你重新格式化文件,将所需的数据放在最前面,让玩家了解如何使用该文件,这可能会起作用。此外,从声音上看,文件系统上的二进制方法可能更适合你,我不确定上下文(web或桌面应用程序),但文件系统,cdn for web;本地桌面通常对视频效果更好。谢谢,这很有帮助。我现在很清楚,MongoDB只能用于元数据。然而,由于我不能使用像Amazon这样的云解决方案来处理二进制数据——我需要将文件保存在本地机器上——我想知道是否还有另一个DB像MongoDB一样易于使用和面向文档,但也支持二进制数据。否则,我唯一的办法就是手动使用本地文件系统,这不太可取。Mobix-我不知道还有任何其他文档数据库能更好地处理这个问题。你可以研究像Adobe的Flash服务器这样的专用媒体服务器,但除此之外,除了文件系统之外,我不知道还有其他选择。如果此答案有帮助,请将其标记为已回答。谢谢