我正在开发一个云平台,我想存储文档和视频文件。
第一个概念是将MongoDB用于简单文档和大型视频文件cassandra。但我已经读过,如果文件大于64 MB,我会遇到问题。
另一方面,mongoDB具有允许大于100MB的文件的GridFS。
我已将mongoDB与Java连接。一开始,数据库是80MB,当我将带有GridFS的1.80GB视频文件插入MongoDB时,我期待数据库捕获类似1.9GB磁盘空间的内容,但它捕获了6 GB ....文件大小的3倍。
以下是我使用的代码:
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("testdb");
DBCollection table = db.getCollection("user");
String newFileName = "Video";
File videoFile = new File("e:\\Magnificent.mp4");
GridFS gfsText = new GridFS(db, "video");
GridFSInputFile gfsFile = gfsText.createFile(videoFile);
gfsFile.setFilename(newFileName);
gfsFile.save();
此外,在运行应用程序并将文件保存到mongodb后,将在DB文件夹中创建以下文件。请注意文件的大小:
第一个问题是为什么它会捕获如此多的磁盘空间?
2个问题:有没有机会使用cassandra存储视频文件500MB-1GB ???
感谢您的任何建议
答案 0 :(得分:4)
广告1: 这是因为文件被分割成块,其中创建了2个集合,一个用于二进制部分(一个块),一个用于元数据。您可以阅读有关MongoDB文档about GridFS和about how the storage is actually maintained的更多信息。
广告2: 是的,有一种方法可以在Cassandra中存储超过64MB的文件。您可以轻松地构建一种机制,将文件拆分为块,并将它们保存为单独的条目。这将以与MongoDB GridFS实现完全相同的方式工作。而且你不会是第一个 - DataStax,一家声称自己落后于" Cassandra,已经在他们的商业堆栈中实现了这个,称为Enterprise。您可以阅读Cassandra File System Design here和一些documentation here。 总的来说,如果您决定构建自己的解决方案,它应该相当简单和直接 - 您只需要拆分文件并将内容放在多个记录中。
另一方面,哲学问题是"为什么"。您为什么要使用数据库系统来存储这么大的文件?有许多更好的方法来处理它,包括类似于Amazon S3或任何其他实现的分布式和复制文件/存储系统,这将使您的生活在如此多的层面上变得如此简单。考虑一下,作为BLOB的良好替代......