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

Stigende hukommelsesgrænse for mongodb samlede job

Nå nej, der er ingen indstilling, og hvis du virkelig tænker over det, er der god grund til dette. Så hvis du først overvejer, hvad aggregat gør, og hvad MongoDB gør generelt, burde det blive klart.

Dette er hvad "bør" være i spidsen for enhver fornuftig aggregeringspipeline:

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

Og disse er grundene:

  1. Det giver god mening at prøve for at reducere det arbejdssæt, du opererer på i enhver operation.

  2. Dette er også den eneste gang du får mulighed for at bruge et indeks til at hjælpe med at søge i udvalget. Hvilket altid er bedre end en samlingsscanning.

  3. Selvom der er en indbygget "optimizer" der leder efter sådanne ting som "projektioner", der begrænser de "udvalgte" felter, er den bedste granskning af arbejdssætstørrelse at kun arbejde på de gyldige optegnelser. Kampe på senere stadier er ikke "optimerede" på denne måde.(Se punkt 1 )

Den næste ting at overveje er MongoDBs generelle adfærd. Så at serverprocessen ønsker at gøre, er "forbruge"meget af den tilgængelige maskinhukommelse, som den kan for at opbevare "arbejdssæt"-dataene (samlinger og/eller indeks) for at "arbejde" på disse data på de mest effektive måder .

Så det er virkelig i "bedste interesser" af databasemotoren til at "bruge" mest af dets hukommelsestildeling på denne måde. Som på den måde, både dit "aggregat" job og alt det andet samtidige processer har adgang til "arbejdsdata" i hukommelsespladsen.

Så derfor er den "ikke optimal" for MongoDB at "stjæle" denne hukommelsesallokering væk fra de andre samtidige operationer bare for at servicere din kørende aggregeringsoperation.

I "programmering til hardwarekrav" vilkår, godt du er klar over, at fremtidige udgivelser tillader aggregeringspipelinen at implementere "diskbrug" for at tillade større behandling. Du kan altid implementere SSD'er eller andet hurtigt lagringsteknologier. Og selvfølgelig "10%" RAM er subjektiv i forhold til mængden af ​​RAM, der er installeret i et system. Så du kan altid øge det.

Sammenfatningen af ​​dette er, at MongoDB har et faktisk job at være et "samtidig datalager" og gør det godt. Hvad det ikke er er en specifik "sammenlægning job-runner " og bør ikke behandles som sådan.

Så enten "opbrud" dine arbejdsmængder, eller øg din hardwarespecifikation, eller bare skift den store "opgavekørsel"-aktivitet til noget, der gør fokus på løbejobbet såsom en Hadoop-stil "mapReduce", og overlad MongoDB til sit job for at betjene dataene.

Eller selvfølgelig skal du ændre dit design til blot at "pre-aggreger" de nødvendige data et sted "on write" .

Som man siger, "Heste til kurser" , eller brug dine værktøjer til det, de er designet for .



  1. Problemer i forbindelse mellem Node.js og MongoDB container ved brug af miljø var. i Docker Compose

  2. Sammenligning af fortegnet 64 bit nummer ved hjælp af 32 bit bitvise operationer i Lua

  3. Hvordan indstilles standard dbpath for mongoDB i Windows 7?

  4. Mongodb kan ikke køre kortreduktion uden js-motoren