MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aumento del limite di memoria per i lavori aggregati mongodb

Ebbene no, non ci sono impostazioni e se ci pensi davvero c'è una buona ragione per questo. Quindi, se consideri prima cosa sta facendo l'aggregato e cosa fa MongoDB in generale, dovrebbe diventare chiaro.

Questo è ciò che "dovrebbe" essere alla "testa" di qualsiasi pipeline di aggregazione sensata:

db.collection.aggregate([
    { "$match:{ /* Something here */ } },

E questi sono i motivi:

  1. Ha un buon senso per provare per ridurre il working set su cui stai operando in qualsiasi operazione.

  2. Questo è anche l'unico tempo si ha l'opportunità di utilizzare un indice per aiutare nella ricerca della selezione. Che è sempre meglio di una scansione di raccolta.

  3. Anche se è presente un "ottimizzatore" integrato che cerca cose come "proiezioni" che limitano i campi "selezionati", il miglior controllore della dimensione del set di lavoro è solo lavorare sui record validi. Le partite della fase successiva non sono "ottimizzate" in questo modo.(Vedi punto 1 )

La prossima cosa da considerare è il comportamento generale di MongoDB. In modo che il processo del server vuole da fare è "consumare" quanto tanto della memoria disponibile della macchina per contenere i dati del "set di lavoro" (collezioni e/o indice) per "lavorare" su quei dati nei mezzi più efficienti .

Quindi lo è davvero nel "migliori interessi" del motore di database per "spendere" la maggior parte della sua allocazione di memoria in questo modo. Come in questo modo, entrambi i tuoi "aggregati" lavoro e tutto il altro i processi concorrenti hanno accesso ai "dati di lavoro" nello spazio di memoria.

Quindi è "non ottimale" per MongoDB per "rubare" questa allocazione di memoria lontano dalle altre operazioni simultanee solo per servire la tua operazione di aggregazione in esecuzione.

Nella "programmazione in base ai requisiti hardware" termini, sei consapevole del fatto che le versioni future consentiranno alla pipeline di aggregazione di implementare "l'uso del disco" per consentire un'elaborazione più ampia. Puoi sempre implementare SSD o altro veloce tecnologie di archiviazione. E ovviamente "10%" di RAM è soggettivo alla quantità di RAM installata in un sistema. Quindi puoi sempre aumentare quello.

Il riepilogo di questo è che MongoDB ha un vero lavoro di essere un "archivio dati simultaneo" e lo fa bene. Cosa non è è una specifica "aggregazione corridore di lavoro " e non dovrebbe essere trattato come tale.

Quindi o "rottura" i tuoi carichi di lavoro o aumentare le tue specifiche hardware o semplicemente cambia la grande attività "attività in esecuzione" in qualcosa che fa concentrarsi sul lavoro in esecuzione come uno stile Hadoop "mapReduce" e lascia MongoDB al suo lavoro di fornire i dati.

O, naturalmente, cambia il tuo design semplicemente in "pre-aggregato" i dati richiesti da qualche parte "in scrittura" .

Come si suol dire, "Cavalli per i corsi" oppure usa i tuoi strumenti per ciò per cui sono stati progettati per .