MongoDB - 文件大小巨大且不断增长

And*_*rew 15 mongodb

我有一个使用mongo存储短生活数据的应用程序.超过45分钟的所有数据都将通过以下脚本删除:

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

我查了一下现状 -

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

因此,根据这1GB的数据占用29GB的存储空间.数据文件夹看起来像这样(您可能会看到很多文件都很旧 - 最后一次访问的时间是5月):

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
Run Code Online (Sandbox Code Playgroud)

根据"顶级"mongod使用29G的虚拟内存(以及780Mb的RSS)

为什么我有这样的异常值?我是否需要运行.remove()函数以从旧值中清除数据库?

Tom*_*icz 25

对于mongod进程,虚拟内存大小和驻留大小似乎非常大.这是良性的:虚拟内存空间将大于打开和映射的数据文件的大小; 驻留大小将根据计算机上其他进程未使用的内存量而有所不同.

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

从MongoDB集合中删除对象时,它占用的空间不会自动被垃圾收集,新记录只会附加到数据文件的末尾,从而使它们变得越来越大.这解释了一切:

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

对于初学者,只需使用:

db.repairDatabase()
Run Code Online (Sandbox Code Playgroud)

  • 我知道这张票很旧,但看起来Mongo的行为自那以后没有改变; 有没有更好的方法来清理空间,然后锁定整个生产实例?难道只是我发现这很烦人吗? (5认同)
  • 我知道这是一个非常古老的线程,但我只想指出将一个成员添加到副本集的选项.这样做会自动压缩新成员的数据.添加后,将新成员作为主要成员启动,并删除先前主要成员上的所有内容,然后将其重新添加到集合中.虽然这可能需要一些时间来处理大型数据集,但它不会阻止您的数据库. (5认同)
  • @Andrew:您可以复制数据库文件并在任何生产服务器上运行`db.repairDatabase()`以查看它将花费多少. (4认同)