sql >> Database >  >> NoSQL >> MongoDB

Verhogen van de geheugenlimiet voor mongodb geaggregeerde taken

Nou nee, er is geen instelling en als je er echt over nadenkt, is daar een goede reden voor. Dus als je eerst bedenkt wat aggregaat doet en wat MongoDB in het algemeen doet, zou het duidelijk moeten worden.

Dit is wat "moet" aan het "hoofd" van elke verstandige aggregatiepijplijn staan:

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

En dit zijn de redenen:

  1. Het is gezond om te proberen om de werkset waarop u werkt te verminderen in elke bediening.

  2. Dit is ook de enige keer krijgt u de mogelijkheid om een ​​index te gebruiken om te helpen bij het zoeken van de selectie. Dat is altijd beter dan een collectiescan.

  3. Ook al is er een ingebouwde "optimizer" die zoekt naar dingen als "projecties" die de "geselecteerde" velden beperken, is de beste controleur van de werksetgrootte om alleen werken aan de geldige records. Latere etappewedstrijden zijn niet "geoptimaliseerd" op deze manier.(Zie punt 1 )

Het volgende dat u moet overwegen, is het algemene gedrag van MongoDB. Zodat het serverproces wil te doen, is "consumeren" als veel van het beschikbare machinegeheugen om de "werkset"-gegevens (verzamelingen en/of index) te bewaren om "werk" op die gegevens op de meest efficiënte manier .

Dus het is echt in het "belangrijkste" van de database-engine om de meeste te "uitgeven" van zijn geheugentoewijzing op deze manier. Op die manier kunnen zowel uw 'geaggregeerde' baan en alle andere gelijktijdige processen hebben toegang tot de "werkgegevens" in de geheugenruimte.

Dus daarom is het "niet optimaal" voor MongoDB om "stelen" deze geheugentoewijzing weg van de andere gelijktijdige bewerkingen alleen om uw actieve aggregatiebewerking te onderhouden.

In de "programmeren naar hardwarevereisten" termen, u weet dat toekomstige releases de aggregatiepijplijn toestaan ​​om "schijfgebruik" te implementeren om grotere verwerking mogelijk te maken. U kunt altijd SSD's of andere snelle implementeren opslagtechnologieën. En natuurlijk "10%" RAM is afhankelijk van de hoeveelheid RAM die in een systeem is geïnstalleerd. U kunt dus altijd verhogen dat.

De samenvatting hiervan is dat MongoDB een echte baan heeft als een "gelijktijdige datastore" en doet dat goed. Wat het niet is is een specifiek "aggregatie job-runner " en mag niet als zodanig worden behandeld.

Dus ofwel "uit elkaar" uw werklast, of verhogen uw hardwarespecificatie, of schakel eenvoudig de grote activiteit "taak uitvoeren" naar iets dat doet focus op de lopende taak, zoals een Hadoop-stijl "mapReduce", en laat MongoDB aan zijn taak over van het bedienen van de gegevens.

Of verander je ontwerp natuurlijk in "pre-aggregate" de vereiste gegevens ergens "op schrijven" .

Zoals het gezegde luidt:"Paarden voor cursussen" , of gebruik je tools waarvoor ze zijn ontworpen voor .



  1. Hoe server-side paginering te bieden met NestJS?

  2. Is memcached een dinosaurus in vergelijking met Redis?

  3. Mongodb datastatistieken visualisatie met behulp van matplotlib

  4. MongoDB-beginner - normaliseren of niet normaliseren?