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

MongoDB NodeJS-Prozess hat zu wenig Arbeitsspeicher

Wenn Ihr MongoDB-Server 2.6 oder neuer ist, wäre es besser, Schreibbefehle zu verwenden Massen-API die die Ausführung von Bulk Insert Operationen, die einfach Abstraktionen auf dem Server sind, um das Erstellen von Massenoperationen zu vereinfachen. Diese Bulk-Operationen gibt es hauptsächlich in zwei Varianten:

  • Massenvorgänge bestellt . Diese Operationen führen alle Operationen der Reihe nach aus und geben beim ersten Schreibfehler einen Fehler aus.
  • Ungeordnete Massenvorgänge . Diese Operationen führen alle Operationen parallel aus und aggregieren alle Fehler. Ungeordnete Massenoperationen garantieren keine Ausführungsreihenfolge.

Beachten Sie, dass die API bei älteren Servern als 2.6 die Operationen herunterkonvertiert. Es ist jedoch nicht möglich, 100 % herunterzukonvertieren, daher kann es einige Randfälle geben, in denen die richtigen Zahlen nicht korrekt gemeldet werden können.

In Ihrem Fall könnten Sie die Bulk-API so:

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://localhost:27017/course", function(err, db) {
    // Handle error
    if(err) throw err;

    // Get the collection and bulk api artefacts
    var col = db.collection('students'),
        types = ['exam', 'quiz', 'homework', 'homework'],
        bulk = col.initializeOrderedBulkOp(), // Initialize the Ordered Batch
        counter = 0;

    // Drop the collection
    col.drop();


    // Representing a long loop with 1 Million Records
    for (var i = 0; i < 1000000; i++) {
        var scores = [],
            class_id = 0,
            record = {};

        // Each student taking 10 classes
        for (var class_counter = 0; class_counter < 10; class_counter ++) {

            // Each Class has 4 grades
            // and each class has 4 grades
            for (var j = 0; j < 4; j++) {
                scores.push({ 'type': types[j], 'score': Math.random()*100 });
            }

            // there are 500 different classes that they can take
            class_id = Math.floor(Math.random() * 501); // get a class id between 0 and 500    

            record['student_id'] = i;
            record['scores'] = scores;
            record['class_id'] = class_id;
        }

        bulk.insert(record);            
        counter++;

        if (counter % 1000 == 0 ) {
            bulk.execute(function(err, result) {  
                // re-initialise batch operation           
                bulk = col.initializeOrderedBulkOp();
            });
        }
    }

    if (counter % 1000 != 0 ){
        bulk.execute(function(err, result) {
            // do something with result
            db.close();
        }); 
    } 
});

--AKTUALISIEREN--

Kudos an @MarkusWMahlberg, zum Generieren von Dummy-Inhalten möchten Sie vielleicht das Paket mgenerate .