2011-06-07 63 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

相關問題