MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Erhöhung des Arbeitsspeicherlimits für mongodb-Aggregatjobs

Nun, nein, es gibt keine Einstellung und wenn Sie wirklich darüber nachdenken, gibt es einen guten Grund dafür. Wenn Sie also zuerst überlegen, was Aggregate tun und was MongoDB im Allgemeinen tut, sollte es klar werden.

Das ist es, was sollte am "Kopf" jeder vernünftigen Aggregationspipeline sein:

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

Und das sind die Gründe:

  1. Es macht guten Sinn versuchen um den Arbeitssatz, mit dem Sie arbeiten, in beliebigen zu reduzieren Betrieb.

  2. Dies ist auch die einzige Mal haben Sie die Möglichkeit, einen Index zu verwenden, um die Auswahl zu durchsuchen. Das ist immer besser als ein Sammlungsscan.

  3. Obwohl es einen eingebauten "Optimierer" gibt das nach Dingen wie "Projektionen" sucht, die die "ausgewählten" Felder einschränken, ist der beste Prüfer der Größe des Arbeitssatzes nur Arbeit an den gültigen Aufzeichnungen. Spiele in späteren Phasen sind nicht "optimiert" auf diese Weise.(Siehe Punkt 1 )

Als nächstes ist das allgemeine Verhalten von MongoDB zu berücksichtigen. Damit der Serverprozess will zu tun, ist "verbrauchen" so viel des verfügbaren Maschinenspeichers so gut wie möglich, um die "Working Set"-Daten (Sammlungen und/oder Index) zu halten, um zu "arbeiten" auf diese Daten auf die effizienteste Weise .

So ist es wirklich im "besten Interesse" der Datenbank-Engine am meisten "ausgeben". seiner Speicherzuweisung auf diese Weise. Auf diese Weise werden sowohl Ihr "Aggregat" Job und alle anderen Nebenläufige Prozesse haben Zugriff auf die "Arbeitsdaten" im Speicherplatz.

Daher ist es "nicht optimal" damit MongoDB "stiehlt" diese Speicherzuordnung nur von den anderen gleichzeitigen Operationen weg um Ihren laufenden Aggregationsvorgang zu warten.

In der "Programmierung nach Hardwareanforderungen" Nun, Sie sind sich bewusst, dass zukünftige Versionen der Aggregationspipeline die Implementierung von "Festplattennutzung" ermöglichen, um eine größere Verarbeitung zu ermöglichen. Sie können SSDs oder andere immer schnell implementieren Speichertechnologien. Und natürlich "10 %" RAM hängt von der Menge an RAM ab, die in einem System installiert ist. Sie können also jederzeit erhöhen das.

Zusammenfassend lässt sich sagen, dass MongoDB einen tatsächlichen Job hat ein "concurrent datastore" zu sein und tut das gut. Was es nicht ist ist ein spezifisches "Aggregation Job-Runner " und sollte nicht als solche behandelt werden.

Also entweder "Trennung" Ihre Workloads, oder erhöhen Ihre Hardware-Spezifikation, oder schalten Sie einfach die große "Task Running"-Aktivität auf etwas um, das macht Konzentrieren Sie sich auf den laufenden Job, z. B. im Hadoop-Stil "mapReduce" und überlassen Sie MongoDB seiner Aufgabe der Bereitstellung der Daten.

Oder ändern Sie Ihr Design natürlich einfach in "Voraggregieren" die erforderlichen Daten irgendwo "on write" .

Wie das Sprichwort sagt, "Pferde für Kurse" , oder verwenden Sie Ihre Tools für das, was sie entworfen haben für .