-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
对象存储 #7
Comments
GridFS实现原理GrudFS是一种将大型文件(超过16MB)存储在MongoDB数据库中的文件规范。MongoDB各个语言驱动均实现了GridFS规范,都可以实现将大型文件存储到MongoDB数据库中。 GridFS的原理就是将大文件分割成许多小块,然后将这些小块封装成BSON对象,存放到特意为GridFS准备的集合。大文件分成小块后,每块作为一个单独的文档存储,然后用一个特别的文档记录来存储分块的信息和文件的元数据,也就是记录这些小块装的是哪一段信息,先后顺序是怎样的,等到用的时候就能拼接起来返回一个完整的大文件。 默认情况下MongoDB为GridFS准备的集合是fs.files和fs.chunks
fs.files中的每个文档代表一个文件,结构如下
fs.chunks用于存储数据块,结构如下:
看到下面这条注意事项,需要测试下: |
试验了给GridFS写入文件和从GridFS读取文件的操作,下面是代码:
现在还不知道GridFS的fs.fiels和fs.chunks是否有这些机制,看到fs.files结构中有uploadDate与md5这两个字段,还不清楚是怎么用的?
那就是说书目xml也可能很大,也需要使用对象资源一样的存储办法?
GridFS本质上还是建立在MongoDB的基本功能上,每个文件元数据信息放在fs.files集合里,每个大文件分成了许多小块作为单独的文档存放的数据块集合fs.chunks,两个集合关联起来,用的时候再拼接成完整 大文件。
目前卡在底层存储这里,不知道怎么突破。 |
书目记录及下级对象资源的文档结构
ObjectId("5aaceadd3b683f1598ceb894")
, 12字节,每个字节两位16进制数字。#0~(当前长度-1)
多个range以逗号分隔,完整时值为#
。在dp2系统中,资源可以分块多次保存,一块的尺寸前端自己定义,目前一块尺寸是500KB(500*1024),超过这个尺寸会分成多次保存,该字段主要用于存储资源未完整时的字节范围。。568c4a13a4b8d5080000000000000018
,当资源不完整时值为null
。null
,在dp2系统中,主要用于大的资源分块多次保存时,每次写后的时间戳。<file size="4145" lastmodified="2018/5/13 15:58:54" />
;对于对象资源,元数据格式一般为。<file mimetype="application/octet-stream" localpath="C:\0-d\0-测试\大备份与恢复测试\l1.dp2bak" size="3298463" lastmodified="2018/5/13 15:35:18" />
,dp2是这样设计的,在想dp3对于书目记录,是否就分成两个成员size和lastmodified;对于对象资源元数据字段多时再用xml表示或者也分成字段。0000000\001
。如果资源不完整值为null。0000000\001_0.temp
。资源完整值为null。问题一:在MongoDB中,书目下的对象资源,是否用内嵌的文档来存储?
在dp2系统,书目记录与其下级的对象资源是作为1+n条记录存储在同一个数据表中,他们记录路径id有内在关联,例如书目记录的id是
0000000001
,它的第1个对象的路径id为0000000001_0
,第2个对象的路径id为0000000001_1
。外部访问资源的路径也有规则,书目记录路径为:
数据库名/书目记录id
,例如中文图书/1
;书目下的对象路径格式为
数据库名/书目记录id/object/对象id
,例如中文图书/1/object/0
。在MongoDB中,书目记录与其下级的对象,可以考虑用一条文档存储,书目文档中有个成员是files,files是个集合,用于存储下级对象。
目前觉得对象的结构与书目记录结构类似。
问题二:关于像书目Xml这类资源的结构,是否有些字段可以不要
如果将书目与对象资源分成不同的结构,对于书目记录结构,不知是否会超过500KB(一般不会吧),如果不超过就可以一次性保存,那么还需要这些range,newdptimestamp,newfilename字段吗?
另外考虑数据库中第一层的结构,可能会存除了书目xml之外的资源,比如新闻一类其它信息,尺寸比较大的情况。
问题三:在MongoDB中,考虑是用二进制类型,还是用本地文件
MongoDB的二进制类型,最大尺寸限制是16MB,对于XML一类是够了。
对于大的对象,有可能超过这个尺寸。MongoDB有关于大文件存储的GridFs,还没有学习。是否先考虑参考dp2用本地文件存储大对象。
The text was updated successfully, but these errors were encountered: