MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Увеличаване на ограничението на паметта за сборни задачи на mongodb

Ами не, няма настройка и ако наистина мислите за това, има добра причина за това. Така че, ако първо разгледате какво прави агрегатът и какво прави MongoDB като цяло, трябва да стане ясно.

Това е, което "трябва" да бъде в „главата“ на всеки разумен тръбопровод за агрегиране:

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

И това са причините:

  1. Има добър смисъл да опитате за да намалите работния набор, с който оперирате всяко операция.

  2. Това е и единственият когато получите възможност да използвате индекс, за да помогнете при търсенето на селекцията. Което евинаги по-добре от сканиране на колекция.

  3. Въпреки че има вграден "оптимизатор" който търси неща като "проекции", ограничаващи "избраните" полета, най-добрият контролер на размера на работния набор е само работа по валидните записи. Мачовете на по-късен етап не са "оптимизирани" по този начин. (Вижте точка 1 )

Следващото нещо, което трябва да вземете предвид, е общото поведение на MongoDB. Така че сървърният процесиска да направите, е "консумирайте" толкото от наличната памет на машината, доколкото може, за да съхранява данните от „работния набор“ (колекции и/или индекс), за да „работи“ върху тези данни по най-ефективния начин .

Така че наистина е в „най-добрите интереси“ на машината на базата данни да "харчи" най-много на неговото разпределение на паметта по този начин. По този начин и двете ви "агрегирани" работа и всички други едновременните процеси имат достъп до "работните данни" в пространството на паметта.

Следователно това е „не оптимално“ за MongoDB да "краде" това разпределение на паметта далеч от другите едновременни операции само за обслужване на вашата текуща операция за агрегиране.

В "програмиране според хардуерните изисквания" условия, вие знаете, че бъдещите издания позволяват на тръбопровода за агрегиране да прилага "използване на диск", за да позволи по-голяма обработка. Винаги можете да внедрите SSD или друг бърз технологии за съхранение. И разбира се "10%" RAM зависи от количеството RAM, което е инсталирано в системата. Така че винаги можете да увеличите това.

Обобщението на това е, че MongoDB има действителна работа да бъдеш "конкурентно хранилище за данни" и го прави добре. Какво не се е конкретно "агрегация job-runner “ и не трябва да се третира като такъв.

Така че или "раздяла" натоварванията си или увеличете вашата хардуерна спецификация или просто превключете голямата дейност „изпълнение на задача“ към нещо, което прави съсредоточете се върху текущата работа като Hadoop стил "mapReduce" и оставете MongoDB да изпълнява своята задача на обслужване на данните.

Или, разбира се, променете дизайна си просто на „предварително агрегатиране“ необходимите данни някъде "на запис" .

Както се казва, „Коне за курсове“ , или използвайте вашите инструменти за това, което са проектирани за .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Изграждане на индекси в MongoDB с .NET драйвер 2.0

  2. Mongodb Увеличете стойността вътре в вложен масив

  3. Mongoose заявка за вложени документи, по-големи или по-малко от определена дата

  4. Как модификаторът $inc работи с едновременни заявки в mongodb?

  5. Mongoose async/await find then edit and save?