2011-08-26 5 views
1

https://gist.github.com/1173528#commentsMongo prend une grande quantité d'espace pour enregistrer ces données?

montre la structure du fichier de données ...

la version courte est

{ "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("...") } 

Les statistiques() sur cette collection est:

{ 
"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 
} 

Notez le taille d'objet moyenne, 5 395 742 octets - ou 5 Mo! 5 Mo pour stocker 16 384 pouces semble assez extrême!

Répondre

2

Voir http://bsonspec.org/#/specification pour la façon dont les choses se sérialisé dans MongoDB. Les tableaux sont en réalité très inefficaces, en particulier parce que nous stockons le numéro d'index sous la forme d'une clé de chaîne pour chaque élément. C'est moins un problème pour les petits tableaux de grands éléments comme les chaînes ou les objets, mais pour les grands tableaux de nombres entiers de 32 bits, cela coûte très cher.

1

MongoDB pré-alloue de l'espace pour ses bases de données: http://www.mongodb.org/display/DOCS/Developer+FAQ#DeveloperFAQ-Whyaremydatafilessolarge%3F

Ce que vous voyez probable est que pré-allocation- si vous ajoutez d'autres éléments, vous ne verrez probablement pas une nouvelle augmentation de l'utilisation de l'espace pendant un long moment .

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

+0

'avgObjSize' ne prend pas en compte la pré-allocation, que vous pouvez facilement vérifier en créant une base de données presque vide. Notez également que ceux-ci fonctionnent à différents niveaux: 'stats()' est un élément de niveau collection, vous devez donc distribuer l'espace vide entre plusieurs collections uniquement pour obtenir une valeur moins utile. – mnemosyn

Questions connexes