Подтвердить что ты не робот

MongoDB - размер файла огромен и растет

У меня есть приложение, которое использует mongo для хранения коротких живых данных. Все данные старше 45 минут удаляются с помощью script что-то вроде:

oldSearches = [list of old searches]
connection = Connection()
db = connection.searchDB
res = db.results.remove{'search_id':{"$in":oldSearches}})

Я проверил текущий статус -

>db.results.stats()
{
        "ns" : "searchDB.results",
        "count" : 2865,
        "size" : 1003859656,
        "storageSize" : 29315124464,
        "nindexes" : 1,
        "ok" : 1
}

Итак, согласно этому 1 гб данных занимает 29 ГБ памяти. Папка данных выглядит так (вы можете видеть, что многие файлы очень старые - последний доступ к ним посередине can):

ls -l /var/lib/mongodb/
total 31506556
-rwxr-xr-x 1 mongodb nogroup          6 2011-06-05 18:28 mongod.lock
-rw------- 1 mongodb nogroup   67108864 2011-05-13 17:45 searchDB.0
-rw------- 1 mongodb nogroup  134217728 2011-05-13 14:45 searchDB.1
-rw------- 1 mongodb nogroup 2146435072 2011-05-20 20:45 searchDB.10
-rw------- 1 mongodb nogroup 2146435072 2011-05-28 00:00 searchDB.11
-rw------- 1 mongodb nogroup 2146435072 2011-05-27 13:45 searchDB.12
-rw------- 1 mongodb nogroup 2146435072 2011-05-29 16:45 searchDB.13
-rw------- 1 mongodb nogroup 2146435072 2011-06-07 13:50 searchDB.14
-rw------- 1 mongodb nogroup 2146435072 2011-06-06 01:45 searchDB.15
-rw------- 1 mongodb nogroup 2146435072 2011-06-07 13:50 searchDB.16
-rw------- 1 mongodb nogroup 2146435072 2011-06-07 13:50 searchDB.17
-rw------- 1 mongodb nogroup 2146435072 2011-06-06 09:07 searchDB.18
-rw------- 1 mongodb nogroup  268435456 2011-05-13 14:45 searchDB.2
-rw------- 1 mongodb nogroup  536870912 2011-05-11 00:45 searchDB.3
-rw------- 1 mongodb nogroup 1073741824 2011-05-29 23:37 searchDB.4
-rw------- 1 mongodb nogroup 2146435072 2011-05-13 17:45 searchDB.5
-rw------- 1 mongodb nogroup 2146435072 2011-05-18 17:45 searchDB.6
-rw------- 1 mongodb nogroup 2146435072 2011-05-16 01:45 searchDB.7
-rw------- 1 mongodb nogroup 2146435072 2011-05-17 13:45 searchDB.8
-rw------- 1 mongodb nogroup 2146435072 2011-05-23 16:45 searchDB.9
-rw------- 1 mongodb nogroup   16777216 2011-06-07 13:50 searchDB.ns
-rw------- 1 mongodb nogroup   67108864 2011-04-23 18:51 test.0
-rw------- 1 mongodb nogroup   16777216 2011-04-23 18:51 test.ns

В соответствии с "топ" mongod использует 29G виртуальной памяти (и 780Mb RSS)

Почему у меня такие ненормальные значения? Нужно ли запускать что-то дополнительное для функции .remove() для очистки базы данных от старых значений?

4b9b3361

Ответ 1

Размер виртуальной памяти и размер резидента будут очень большими для процесса mongod. Это доброкачественное: пространство виртуальной памяти будет просто больше, чем размер файлов данных, открытых и отображенных; размер резидента будет варьироваться в зависимости от объема памяти, не используемого другими процессами на машине.

http://www.mongodb.org/display/DOCS/Caching

Когда вы удаляете объект из коллекции MongoDB, занимаемое им пространство автоматически не собирает мусор, а новые записи добавляются только к концу файлов данных, что делает их все больше и больше. Это все объясняет:

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

Для начала просто используйте:

db.repairDatabase()