我是MongoDB的新手,我有一个包含以下字段的集合:
> db.TestTable.findOne()
{
"_id" : ObjectId("527c48e99000cf10bc2a1d82"),
"ID" : "16587",
"Name" : "N15247",
"Serial1" : "11",
"Serial2" : "727",
"DateTime" : ISODate("1998-12-15T18:30:00Z"),
"CompID" : "ID465",
"CompName" : "F1460"
}
我使用cson驱动程序使用BsonDocument将大约300,000,000个文档插入到集合中。集合的大小是:
> db.TestTable.stats()
{
"ns" : "FeatureParser.LogsTable",
"count" : 300000000,
"size" : 62399477600,
"avgObjSize" : 207.99825866666666,
"storageSize" : 68783787568,
"numExtents" : 54,
"nindexes" : 2,
"lastExtentSize" : 2146426864,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 14878186064,
"indexSizes" : {
"_id_" : 9746789472,
"dateTime_1" : 5131396592
},
"ok" : 1
}
MongoDB是否为文件inserteD占用了太多空间?无论如何,DB的大小可以减少吗?
提前致谢。
答案 0 :(得分:3)
来自http://docs.mongodb.org/manual/faq/storage/
预分配的数据文件。
在数据目录中,MongoDB预分配 数据文件到特定大小,部分是为了防止文件系统 碎片。 MongoDB命名第一个数据文件.0 ,. next .1等 mongod分配的第一个文件是64 兆字节,接下来的128兆字节,依此类推,最多2千兆字节 所有后续文件都是2千兆字节。数据文件 包含已分配空间但不保留数据的文件。 mongod可能 分配一个可能90%为空的1千兆字节数据文件。对于大多数 数据库,与数据库相比,未使用的分配空间很小。
答案 1 :(得分:3)
目前尚不清楚存储的尺寸被认为是巨大的 - 预计尺寸是多少?
我已插入[300M]文件
每行大约200字节:
{"_id" : ObjectId("527c48e99000cf10bc2a1d82"),"ID" : "16587","Name" : "N15247","Serial1" : "11","Serial2" : "727","DateTime" : ISODate("1998-12-15T18:30:00Z"),"CompID" : "ID465","CompName" : "F1460"}
^199 chars
报告/确认为:
“avgObjSize”:207.99825866666666 [bytes]
总数据大小为:
“size”:62399477600 [bytes]
因此:
300, 000, 000 rows x
200 bytes per row
60, 000, 000, 000 bytes
这简单地证实了插入数据的估计值非常接近集合中数据的大小(62GiB v 60GiB)。
实际存储大小为68, 783, 787, 568
(68GiB),这也非常接近数据大小,差异是索引的开销和存储空间的预分配。
因此,很容易预期观察到的结果。如果上述内容不符合要求 - 请通过编辑问题进行澄清。
答案 2 :(得分:1)
人们已经提出了为什么收集这么大的原因,所以我没有改写他们的话,我会解决第二个问题。如何减小集合的大小。
有一种很好的方法可以减少收藏的大小。
因为mongodb存储每个文档的密钥,所以可以通过缩短名称来大大减小集合的大小。通过这种方式,您将收集包含以下文档:
{
"_id" : ObjectId("527c48e99000cf10bc2a1d82"),
"ID" : "16587",
"n" : "N15247",
"s" : "11",
"c" : "727",
"d" : ISODate("1998-12-15T18:30:00Z"),
"c" : "ID465",
"f" : "F1460"
}
在您的应用程序层上,您可以创建从这些神秘名称到普通名称的映射。