2015-01-28 14 views
5

Quando si esegue una query su una raccolta MongoDB, se la lettura richiederà un po 'di tempo, il cursore scade. C'è un'opzione timeout=False, che non fa scadere il cursore, e quindi deve essere chiuso manualmente.Come uccidere i cursori morti in MongoDB

Quando uno script si arresta in modo anomalo con un cursore aperto, quel cursore presumibilmente rimane solo attivo nel DB fino al successivo riavvio. Nel pannello di controllo MMS, questi sono visibili come una costante elevata nella tabella "cursori".

mms cursors

Quali sono le conseguenze di questo? E come posso uccidere questi cursori manualmente?

+1

Utilizzare il metodo ['close'] (http://api.mongodb.org/python/current/api/pymongo/cursor.html#pymongo.cursor.Cursor.close) dell'oggetto cursore. Il costo di avere cursori aperti è la memoria richiesta sul server per il cursore. È minimo ma può diventare un problema se il numero di cursori aperti cresce a centinaia o migliaia. Il cursore sarà anche chiuso automaticamente se l'oggetto cursore è spazzato via da Python. – wdberkeley

+0

Grazie per la tua risposta! Cosa succede se il mio script è morto, e python non ha gc i cursori e li ha chiusi? Mi stavo chiedendo se c'è un modo per trovarli e chiuderli. – user831885

+2

Non per quanto ne so. Sarebbe possibile con la funzione richiesta in [SERVER-3090] (https://jira.mongodb.org/browse/SERVER-3090) ma che non è stata ancora implementata. Chiaramente, dovresti evitare i cursori immortali. È possibile impostare il timeout in modo che sia grande ma finito, oppure è possibile utilizzare un ordinamento sul cursore e riaprire il cursore dall'ultimo elemento visto se si chiude dopo un periodo di inattività. – wdberkeley

risposta