2011-06-07 6 views
13

J'ai une application qui utilise mongo pour stocker des données de vie de courte durée. Toutes les données de plus de 45 minutes est supprimé par le script quelque chose comme:MongoDB - la taille du fichier est énorme et en croissance

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

J'ai vérifié l'état actuel -

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

Ainsi, selon cette 1Go de données de stockage occupe 29FR. dossier de données ressemble à ceci (Vous pouvez voir que de nombreux fichiers sont très anciens - dernier accès au milieu de mai):

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 

Selon « top » mongod utilise 29G de mémoire virtuelle (et 780Mb de RSS)

Pourquoi ai-je de telles valeurs anormales? Ai-je besoin d'exécuter quelque chose de supplémentaire à la fonction .remove() pour nettoyer la base de données des anciennes valeurs?

+2

Sur intérêt, avez-vous enquêté sur l'utilisation des collections plafonnés pour ce genre de problème? Cela supprimerait les problèmes d'espace disque, supprimerait le besoin d'un script de suppression et pourrait rendre l'application plus rapide ... – Rich

+1

En tant que sidenote: Pour ces données de courte durée, j'utiliserais Redis qui prend en charge expire-timeout sur toutes les données. –

+1

Mongo est juste lourd de stockage. BSON prend beaucoup de place car il stocke le nom complet de la clé ainsi que la valeur de chaque champ dans un document. Comme d'autres l'ont dit, il existe des solutions de contournement, mais vous devrez accepter l'utilisation d'un système de fichiers volumineux si vous utilisez MongoDB. –

Répondre

23

taille de la mémoire virtuelle et la taille de résident semble être très important pour le processus de mongod. C'est bénin: l'espace de mémoire virtuelle sera juste plus grand que la taille des fichiers de données ouverts et mappés; La taille du résident variera en fonction de la quantité de mémoire non utilisée par d'autres processus sur la machine.

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

Lorsque vous supprimez un objet de collection MongoDB, l'espace qu'il occupait est pas automatiquement les déchets collectés et les nouveaux enregistrements ne sont ajoutés à la fin des fichiers de données, les faire croître de plus en plus. Ce qu'il explique tout:

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

Pour commencer, utilisez simplement:

db.repairDatabase() 
+0

autant que j'ai lu - réparation va bloquer totalement mongodb pendant un moment - non? Avez-vous des attentes? Combien de temps cela prendra-t-il? – Andrew

+4

@Andrew: Vous pouvez copier les fichiers de la base de données et exécuter 'db.repairDatabase()' sur un serveur de production pour voir combien cela va prendre. –

+5

Je sais que ce ticket est ancien, mais ressemble à comportement Mongo n'a pas changé depuis; n'y a-t-il vraiment pas de meilleur moyen de nettoyer l'espace, sinon de verrouiller toute votre instance de production? est-ce juste moi qui trouve ça agaçant? – JMac

Questions connexes