In generale, se non è necessario ridurre i file di dati, non è necessario ridurli. Questo perché "far crescere" i propri file di dati su disco è un'operazione abbastanza costosa e più spazio sarà possibile da MongoDB nei file di dati, minore sarà la frammentazione che si avrà.
Quindi, si dovrebbe provare a fornire quanto più spazio sul disco possibile per il database.
Tuttavia se è necessario ridurre il database, è necessario tenere a mente due elementi.
MongoDB cresce è i file di dati di raddoppiando così i file di dati possono essere 64 MB, quindi 128MB, ecc fino a 2GB (a quindi si arresta il raddoppio per mantenere i file fino a 2GB.)
Come con la maggior parte dei database ... a fare operazioni come la riduzione di è necessario pianificare un lavoro separato per fare , non c'è "autoshrink" in MongoDB. Infatti i principali database noSQL (odio quel nome) solo Riak si autoshrink. Pertanto, è necessario creare utilizzando il programma di pianificazione del sistema operativo per eseguire una riduzione. È possibile utilizzare uno script bash, o di avere un lavoro eseguire uno script php, ecc
Serverside Javascript
È possibile utilizzare lato server Javascript per fare lo strizzacervelli ed eseguire che JS attraverso la shell di Mongo su un regolare basi tramite un lavoro (come cron o il servizio Windows scheduling) ...
assumendo una collezione chiamata foo si salva il javascript di seguito in un file chiamato bar.js ed eseguire ...
$ mongo foo bar.js
il file JavaScript sarebbe simile ...
// Get a the current collection size.
var storage = db.foo.storageSize();
var total = db.foo.totalSize();
print('Storage Size: ' + tojson(storage));
print('TotalSize: ' + tojson(total));
print('-----------------------');
print('Running db.repairDatabase()');
print('-----------------------');
// Run repair
db.repairDatabase()
// Get new collection sizes.
var storage_a = db.foo.storageSize();
var total_a = db.foo.totalSize();
print('Storage Size: ' + tojson(storage_a));
print('TotalSize: ' + tojson(total_a));
Questo farà eseguire e restituire qualcosa di simile ...
MongoDB shell version: 1.6.4
connecting to: foo
Storage Size: 51351
TotalSize: 79152
-----------------------
Running db.repairDatabase()
-----------------------
Storage Size: 40960
TotalSize: 65153
Esegui questo su un programma (durante il picco di nessuno ore) e sei a posto.
con Cap Collezioni
Tuttavia c'è un altra opzione, capped collections.
collezioni con Cap sono fisse dimensionati collezioni che hanno una caratteristica molto alte prestazioni auto-FIFO età-out (età out si basa su ordine di inserimento). Sono un po 'come il concetto "RRD" se si ha familiarità con quello.
Inoltre, collezioni capped automaticamente, con alte prestazioni, mantenere l'ordine di inserimento per i oggetti della collezione; questo è molto potente per determinati casi d'uso come la registrazione.
Fondamentalmente si può limitare la dimensione (o il numero di documenti in) una collezione da dire .. 20GB e una volta raggiunto tale limite MongoDB inizierà a buttare fuori i record più vecchi e sostituirli con le voci più recenti come hanno entrare.
Questo è un ottimo modo per mantenere una grande quantità di dati, scartando i vecchi dati col passare del tempo e mantenendo la stessa quantità di spazio su disco utilizzato.
Grazie per il grande post. se non rimpicciolirai i file di dati, il mongod costerà sempre molta memoria, come potrei risolverlo? –
@Zealot ... Vedere la mia risposta sull'uso della memoria, potrebbe essere utile. http://stackoverflow.com/questions/4468873/how-to-release-the-caching-which-is-used-by-mongodb/4482465#4482465 –
Ho capito, abbiamo 16 GB di memoria, e il mongodb costa 4 GB . Quindi non mi interessa. Grazie per queste risposte. –