2011-08-26 5 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! 16,384 intsを格納するための5 MBはかなり極端なようです!

答えて

2

は、物事はMongoDBの中でシリアル化された取得方法についてはhttp://bsonspec.org/#/specificationを参照してください。配列は実際には非常に空間的に非効率的です。なぜなら、各要素の文字列キーとしてインデックス番号を格納するからです。これは文字列やオブジェクトのような大きな要素の小さな配列では問題になりませんが、32ビットintの大きな配列の場合は非常に高価です。

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'は事前割り当てを考慮していないため、ほぼ空のdbを作成することで簡単に確認できます。 'stats()'はコレクションレベルの要素なので、あまり有用でない値を得るために空のスペースを複数のコレクションに分散させる必要があります。 – mnemosyn

関連する問題