2011-06-07 27 views
13

Kısa yaşam verilerini depolamak için mongo kullanan bir uygulamam var. 45 dakika daha eski tüm veriler gibi komut şey tarafından kaldırılır:MongoDB - dosya boyutu çok büyük ve büyüyen

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

ben mevcut durumu kontrol ettim -

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

Yani, verilerin bu 1gb göre depolama 29TR kaplar. Veri klasör bu (Birçok dosyalar çok eski olduğunu görebilirsiniz - Son mayıs ortasında erişilir) aşağıdaki gibidir: göre

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 

"top" mongod

sanal bellek 29G (ve RSS 780Mb) kullanan

Neden böyle anormal değerlerim var? Veritabanını eski değerlerden temizlemek için .remove() işlevine ek bir şey çalıştırmam gerekiyor mu?

+2

, sorunun bu tür Capped Koleksiyonlar kullanarak araştırdık Bu her şeyi açıklıyor? Bu, disk alanı sorunlarını ortadan kaldıracak, bir kaldırma komut dosyasına olan ihtiyacı ortadan kaldıracak ve uygulamayı daha hızlı hale getirecektir ... – Rich

+1

Bir sidenote olarak: Bu kısa ömürlü veriler için, herhangi bir verinin süresinin dolmasına neden olan Redis'i kullanacağım. –

+1

Mongo sadece düz depolama alanıdır. BSON, bir alandaki her alanın değerinin yanı sıra tam anahtar adını da kaydettiği için çok yer kaplar. Başkalarının söyledikleri gibi, geçici çözümler var, ancak MongoDB kullanıyorsanız büyük dosya sistemi kullanımını kabul etmeniz gerekecek. –

cevap

23

Sanal bellek boyutu ve ikamet boyutu mongod süreci için çok büyük olduğu görülecektir. Bu iyi huylu: sanal bellek alanı, açık ve eşlenen veri dosyalarının boyutundan daha büyük olacak; Yerleşik boyut, makinedeki diğer işlemler tarafından kullanılmayan bellek miktarına bağlı olarak değişecektir. http://www.mongodb.org/display/DOCS/Caching

Eğer MongoDB koleksiyonundan bir nesne kaldırmak

, işgal alanı otomatik çöp toplandı ve yeni kayıtlar sadece onları büyür ve kocaman hale veri dosyalarının sonuna eklenir değildir. , Sadece kullanım

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

başlayanlar için:

ilgi Out
db.repairDatabase() 
+0

okuduğum kadarıyla - onarım bir süreliğine mongodb'i tamamen engelleyecektir - değil mi? Beklentileriniz var mı - ne kadar sürecek? – Andrew

+4

@Andrew: Ne kadar alacağını görmek için veritabanı dosyalarını kopyalayabilir ve 'db.repairDatabase()' yi hiçbir üretim sunucusunda çalıştırabilirsiniz. –

+5

Bu biletin eski olduğunu biliyorum, ancak Mongo'nun davranışları o zamandan beri değişmedi; Alanı temizlemenin daha iyi bir yolu yok, diğer tüm üretim örneğini kilitledikten sonra? Bu sinir bozucu bu sadece bana öyle mi? – JMac