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

Wie kann ich die Massenleistung von MongoDB verbessern?

Senden Sie die Masseneinfügungsvorgänge in Stapeln, da dies zu weniger Datenverkehr zum Server führt und somit effiziente Überweisungen durchführt, indem nicht alles in einzelnen Anweisungen gesendet wird, sondern in überschaubare Blöcke für die Serverzusage aufgeteilt werden. Bei diesem Ansatz vergeht auch weniger Zeit beim Warten auf die Antwort im Rückruf.

Ein viel besserer Ansatz wäre die Verwendung von async -Modul, sodass selbst das Schleifen der Eingabeliste eine nicht blockierende Operation ist. Die Auswahl der Stapelgröße kann variieren, aber die Auswahl von Stapeleinfügungsvorgängen pro 1000 Einträge würde es sicher machen, unter der harten Grenze von 16 MB BSON zu bleiben, da die gesamte "Anforderung" einem BSON-Dokument entspricht.

Im Folgenden wird die Verwendung von async demonstriert Modul's while, um das Array zu durchlaufen und wiederholt die Iteratorfunktion aufzurufen, während test true zurückgibt. Ruft Callback auf, wenn es gestoppt wird oder wenn ein Fehler auftritt.

var bulk = col.initializeOrderedBulkOp(),
    counter = 0,
    len = array.length,
    buildModel = function(index){   
        return {
            "data": array[index],
            "metaData": {
                "hash": hash,
                "date": timestamp,
                "name": name
            }
        }
    };

async.whilst(
    // Iterator condition
    function() { return counter < len },

    // Do this in the iterator
    function (callback) {
        counter++;
        var model = buildModel(counter);
        bulk.insert(model);

        if (counter % 1000 == 0) {
            bulk.execute(function(err, result) {
                bulk = col.initializeOrderedBulkOp();
                callback(err);
            });
        } else {
            callback();
        }
    },

    // When all is done
    function(err) {
        if (counter % 1000 != 0) {
            bulk.execute(function(err, result) {
                console.log("More inserts.");
            }); 
        }           
        console.log("All done now!");
    }
);