Хранит ли MongoDB документы в 4-мегабайтных блоках? - PullRequest
1 голос
/ 14 марта 2011

Я прочитал, что размер документов MongoDB ограничен 4 МБ.Я также читал, что когда вы вставляете документ, MongoDB добавляет некоторые отступы, так что если вы добавляете что-то в документ, весь документ не нужно перемещать и переиндексировать.

Так что мне интересно,он хранит документы в 4-мегабайтных блоках на диске?

Спасибо

Ответы [ 2 ]

5 голосов
/ 14 марта 2011

Начиная с версии 1.8, размер отдельных документов теперь ограничен 16 МБ (ранее было 4 МБ).Это произвольное ограничение, заключающееся в том, что когда вы читаете документ с диска, весь документ читается в ОЗУ.Поэтому я думаю, что намерение состоит в том, что это ограничение существует для того, чтобы попытаться защитить память / заставить вас задуматься о дизайне вашей схемы.

Данные затем сохраняются в нескольких файлах данных на диске - я забываю исходный размер файла, но каждый раз, когда база данных увеличивается, создается новый файл, в который расширяется каждый новый файл, который больше предыдущего.файл, пока не будет достигнут один размер файла 2 ГБ.С этого момента, если база данных продолжает расти, для вставляемых в нее документов создаются последующие файлы данных объемом 2 ГБ.

«чанки» имеют значение в аспекте сегментирования MongoDB.При этом документы хранятся в «блоках» настраиваемого размера, а когда необходимо выполнить балансировку, именно эти куски данных (n документов) перемещаются.

2 голосов
/ 08 апреля 2011

Простой ответ - «нет».Фактическое пространство, занимаемое документом в файлах Mongo, является переменным, но это не максимальный размер документа.Механизм БД следит за тем, насколько ваши документы имеют тенденцию изменяться после вставки, и рассчитывает коэффициент заполнения на основании этого.Так что он все время меняется.

Если вам интересно, вы можете увидеть фактический коэффициент заполнения и пространство хранения ваших данных, используя функцию .stats() для коллекции в mongo ракушка.Вот реальный пример (с некоторыми именами, измененными для защиты невинных клиентов):

{14:42} ~/my_directory ➭ mongo
MongoDB shell version: 1.8.0
connecting to: test
> show collections
schedule_drilldown
schedule_report
system.indexes
> db.schedule_report.stats()
{
    "ns" : "test.schedule_report",
    "count" : 16749,
    "size" : 60743292,
    "avgObjSize" : 3626.681712341035,
    "storageSize" : 86614016,
    "numExtents" : 10,
    "nindexes" : 3,
    "lastExtentSize" : 23101696,
    "paddingFactor" : 1.4599999999953628,
    "flags" : 1,
    "totalIndexSize" : 2899968,
    "indexSizes" : {
        "_id_" : 835584,
        "WeekEnd_-1_Salon_1" : 925696,
        "WeekEnd_-1_AreaCode_1" : 1138688
    },
    "ok" : 1
}

Итак, моя тестовая коллекция содержит около 16 749 записей со средним размером около 3,6 КБ ().«avgObjSize» ) и общий размер данных около 60 МБ ( «размер» ).Однако оказывается, что они на самом деле занимают около 86 МБ на диске (" storageSize ") из-за коэффициента заполнения.Этот коэффициент заполнения менялся с течением времени, так как документы коллекции были обновлены, но если бы я вставил новый документ прямо сейчас , он выделил бы в 1,46 раза больше места, чем требуется документу ( "paddingFactor") чтобы избежать необходимости перемещать вещи, если я изменю это позже.Для меня это справедливый компромисс между размером и скоростью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...