sql >> Databasteknik >  >> NoSQL >> MongoDB

Ökande minnesgräns för mongodb aggregerade jobb

Tja nej det finns ingen inställning och om du verkligen tänker på det så finns det goda skäl till detta. Så om du först funderar på vad aggregat gör och vad MongoDB gör i allmänhet borde det bli tydligt.

Det här är vad "bör" stå i spetsen för någon vettig aggregeringspipeline:

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

Och dessa är anledningarna:

  1. Det är bra vettigt att prova för att minska arbetsuppsättningen som du använder i någon operation.

  2. Detta är också den enda gång du får möjlighet att använda ett index för att underlätta sökningen i urvalet. Vilket är alltid bättre än en samlingsskanning.

  3. Även om det finns en inbyggd "optimizer" som letar efter sådant som "projektioner" som begränsar de "valda" fälten, är den bästa granskaren av arbetsuppsättningens storlek att endast arbeta med giltiga register. Matchningar i senare skeden är inte "optimerade" på detta sätt.(Se punkt 1 )

Nästa sak att tänka på är det allmänna beteendet hos MongoDB. Så att serverprocessen vill att göra är "konsumera" lika mycket av det tillgängliga maskinminnet som det kan för att hålla "working set"-data (samlingar och/eller index) för att "arbeta" på dessa uppgifter på mest effektiva sätt .

är det verkligen i "bästa intresse" av databasmotorn för att "spendera" mest av dess minnesallokering på detta sätt. Liksom på det sättet, både ditt "aggregat" jobb och allt övrigt samtidiga processer har tillgång till "arbetsdata" i minnesutrymmet.

Så därför är det "inte optimalt" för MongoDB att "stjäla" denna minnesallokering borta från andra samtidiga operationer bara för att serva din pågående aggregeringsoperation.

I "programmering till hårdvarukrav" termer, väl du är medveten om att framtida versioner tillåter aggregeringspipelinen att implementera "diskanvändning" för att tillåta större bearbetning. Du kan alltid implementera SSD:er eller annat snabbt lagringsteknik. Och naturligtvis "10%" RAM är subjektivt till mängden RAM som är installerat i ett system. Så du kan alltid öka det.

Sammanfattningen av detta är att MongoDB har ett verkligt jobb att vara en "samtidig databutik" och gör det bra. Vad det inte är är en specifik "aggregation job-runner " och bör inte behandlas som sådan.

Så antingen "uppbrott" dina arbetsbelastningar, eller öka din hårdvaruspecifikation, eller helt enkelt byta den stora aktiviteten "körning av uppgifter" till något som gör fokusera på löpjobbet som en Hadoop-stil "mapReduce", och lämna MongoDB till sitt jobb för att servera data.

Eller naturligtvis, ändra din design till att helt enkelt "pre-aggregate" den nödvändiga informationen någonstans "on write" .

Som ordspråket säger, "Hästar för kurser" , eller använd dina verktyg för vad de är designade för .



  1. Sortera med MongoEngine?

  2. Fråga för att få ett värde genom att subtrahera ett värde från nuvarande och nästa dokument

  3. Redis kluster/lastbalansering

  4. MongoDB hanterar inte aggregering med allowDiskUsage:True