sql >> Databáze >  >> NoSQL >> MongoDB

Zvýšení limitu paměti pro agregační úlohy mongodb

No ne, žádné nastavení neexistuje a pokud o tom opravdu přemýšlíte, je pro to dobrý důvod. Takže pokud nejprve zvážíte, co dělá agregát a co dělá MongoDB obecně, mělo by to být jasné.

To je to, co „mělo by“ být v „hlavě“ jakéhokoli rozumného agregačního potrubí:

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

A toto jsou důvody:

  1. Dává to dobrý smysl vyzkoušet snížit pracovní sadu, se kterou pracujete v jakémkoli operace.

  2. Toto je také jediné čas, dostanete příležitost použít rejstřík, který vám pomůže při hledání výběru. Což je vždy lepší než skenování sbírky.

  3. A to i přesto, že je zde vestavěn "optimalizátor" který hledá takové věci jako "projekce" omezující "vybraná" pole, nejlepším skrutátorem velikosti pracovní sady je pouze pracovat na platných záznamech. Zápasy pozdější fáze nejsou "optimalizovány" tímto způsobem. (Viz bod 1 )

Další věcí, kterou je třeba zvážit, je obecné chování MongoDB. Takže proces serveru chce udělat, je "spotřebovat" jako moc dostupné paměti stroje, jak je to možné, za účelem uchování dat „pracovní sady“ (kolekcí a/nebo indexů), aby mohla „fungovat“ na těchto datech nejefektivnějším způsobem .

Tak to skutečně je v „nejlepším zájmu“ databázového stroje „utratit“ nejvíce alokace paměti tímto způsobem. Tímto způsobem se obě vaše "agregují" práci a všechny ostatní souběžné procesy mají přístup k "pracovním datům" v paměťovém prostoru.

Takže to "není optimální" aby MongoDB "ukradl" tato alokace paměti je vzdálená od ostatních souběžných operací jen k obsluze vaší běžící agregační operace.

V „programování podle hardwarových požadavků“ dobře víte, že budoucí verze umožňují agregačnímu kanálu implementovat „použití disku“, aby bylo možné větší zpracování. Vždy můžete implementovat SSD nebo jiné rychlé skladovací technologie. A samozřejmě "10 %" RAM závisí na množství paměti RAM nainstalované v systému. Vždy tedy můžete zvýšit to.

Závěrem je, že MongoDB má skutečnou práci je "souběžné úložiště dat" a dělá to dobře. Co to není je specifická "agregace job-runner “ a nemělo by se s ním tak zacházet.

Takže buď "rozchod" své pracovní vytížení nebo zvýšit vaší hardwarové specifikaci, nebo jednoduše přepněte velkou aktivitu „spouštění úloh“ na něco, co dělá zaměřte se na běžící práci, jako je styl ve stylu hadoop "mapReduce" a ponechat MongoDB jeho úkolu poskytování dat.

Nebo samozřejmě změňte svůj design na jednoduše "předběžně agregovat" požadovaná data někde "při zápisu" .

Jak se říká, "Koně na kurzy" nebo použijte své nástroje k tomu, k čemu byly navrženy pro .



  1. res.redirect zobrazující staré informace po odeslání formuláře?

  2. Jak vypsat všechny databáze MongoDB v Node.js?

  3. Jak načíst záznam z mongodb pomocí pole _id a zobrazit načtený záznam v konzole pomocí java

  4. ServerSelectionTimeoutError errno 11001 getaddrinfo se nezdařilo python