2011-06-07 155 views
13

我有一个应用程序,它使用mongo来存储简短的生活数据。超过45分钟之前的所有数据由脚本像删除:MongoDB - 文件大小是巨大的和不断增长的

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 
} 

因此,根据这个数据1GB的所占的存储29GB。 Data文件夹看起来是这样的(你可以看到,很多文件都是很老的 - 去年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 

据“顶”的mongod使用虚拟内存29G(和RSS的780MB)

为什么我有这样的异常值?我是否需要额外运行.remove()函数来清理旧值的数据库?

+2

出于兴趣,你研究使用加盖集合了这样的问题?这将消除磁盘空间的问题,删除需要删除脚本,并可能使应用程序更快... – Rich 2012-02-20 14:26:23

+1

作为一个旁注:对于这种短期的数据,我会使用Redis,它支持任何数据的过期超时。 – 2013-01-09 12:23:19

+1

Mongo只是普通的存储空间。 BSON占用大量空间,因为它存储了完整的键名以及文档中每个字段的值。正如其他人所说,有解决方法,但如果您使用MongoDB,则需要接受大文件系统的使用。 – 2013-10-25 03:44:37

回答

23

虚拟内存大小和驻留大小对于mongod进程来说似乎非常大。这是良性的:虚拟内存空间将大于打开和映射的数据文件的大小;常驻大小会因机器上其他进程未使用的内存量而异。

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

当您从MongoDB的集合的对象,它占用的空间是不会自动垃圾回收和新记录只追加到数据文件的末尾,使他们成长越来越大。这可以解释这一切:

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

对于初学者,只需使用:

db.repairDatabase() 
+0

据我读 - 修复将完全阻止mongodb一段时间 - 对吗?你有没有什么期望 - 需要多长时间? – Andrew 2011-06-07 10:26:59

+4

@Andrew:您可以复制数据库文件并在没有生产服务器的情况下运行'db.repairDatabase()'以查看需要多少资源。 – 2011-06-07 10:36:50

+5

我知道这张票很旧,但看起来从那时起,Mongo行为并没有改变;是否真的没有更好的方式来清理空间,其他锁定整个生产实例?只是我觉得这很烦人吗? – JMac 2013-10-05 03:40:03