2011-08-26 53 views
1

https://gist.github.com/1173528#commentsMongo正在占用大量的空间来保存这些数据?

显示了数据文件的结构...

的短版是

{ "img_ref" : { 
    "$ref" : "mapimage", 
    "$id" : ObjectId("4e454599f404e8d51c000002") 
}, 
    "scale" : 128, "image" : "4e454599f404e8d51c000002", "tile_i" : 0, "tile_j" : 9, "w" : 9, "e" : 10, "n" : 0, "s" : 0, 
    "heights" : [ 
    [ 
     0, 
     2, 
     0, 
     1, 
     515, 
     0, 
     256, 
     ...], [...] 
, _id: ObjectId("...") } 

在此收集的统计数据()是:

{ 
"ns" : "ac2.mapimage_tile", 
"count" : 18443, 
"size" : 99513670744, 
"avgObjSize" : 5395742.056281516, 
"storageSize" : 100336473712, 
"numExtents" : 74, 
"nindexes" : 4, 
"lastExtentSize" : 2146426864, 
"paddingFactor" : 1, 
"flags" : 0, 
"totalIndexSize" : 5832704, 
"indexSizes" : { 
    "_id_" : 786432, 
    "img_ref_1_tile_i_1_tile_j_1" : 2236416, 
    "image_1" : 1212416, 
    "image_1_tile_i_1_tile_j_1_scale_1" : 1597440 
}, 
"ok" : 1 
} 

注意平均对象大小,5,395,742字节 - 或5 MB! 5 MB用于存储16,384个整数似乎非常极端!

回答

2

http://bsonspec.org/#/specification事情怎么弄在MongoDB中连载。数组实际上空间效率非常低,特别是因为我们将索引号存储为每个元素的字符串键。对于像字符串或对象这样的大型元素的小型数组来说,这不是一个问题,但对于32位整数大型数组而言,这非常昂贵。

1

MongoDB的预分配的空间为它的数据库:http://www.mongodb.org/display/DOCS/Developer+FAQ#DeveloperFAQ-Whyaremydatafilessolarge%3F

什么,你很可能看到的是,预allocation-如果你添加更多的项目,你可能不会看到在太空中使用了很长一段时间的进一步增加。

另外:http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

+0

'avgObjSize'不考虑预分配,您可以通过创建一个几乎空白的数据库来轻松进行验证。另外请注意,这些操作在不同的级别上:'stats()'是一个集合级别的元素,所以您必须将空间分配到多个集合中,以获得较少帮助的值。 – mnemosyn