MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Le processus MongoDB NodeJS manque de mémoire

Si votre serveur MongoDB est 2.6 ou plus récent, il serait préférable de profiter de l'utilisation d'une commande d'écriture API de masse qui permettent l'exécution de insertion en masse opérations qui sont simplement des abstractions au-dessus du serveur pour faciliter la création d'opérations en bloc. Ces opérations groupées se présentent principalement sous deux formes :

  • Opérations groupées ordonnées . Ces opérations exécutent toutes les opérations dans l'ordre et génèrent une erreur à la première erreur d'écriture.
  • Opérations groupées non ordonnées . Ces opérations exécutent toutes les opérations en parallèle et agrègent toutes les erreurs. Les opérations en bloc non ordonnées ne garantissent pas l'ordre d'exécution.

Notez que pour les serveurs plus anciens que 2.6, l'API convertira les opérations. Cependant, il n'est pas possible de convertir à 100 %, il peut donc y avoir des cas extrêmes où il ne peut pas rapporter correctement les bons chiffres.

Dans votre cas, vous pouvez implémenter l'API de masse comme ceci :

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();
        }); 
    } 
});

-- MISE À JOUR --

Félicitations à @MarkusWMahlberg, pour avoir généré du contenu factice, vous pouvez essayer le package mgenerate .