sql >> Base de Datos >  >> NoSQL >> MongoDB

Proceso MongoDB NodeJS sin memoria

Si su servidor MongoDB es 2.6 o más nuevo, sería mejor aprovechar el uso de comandos de escritura API a granel que permiten la ejecución de bulk insert operaciones que son simplemente abstracciones en la parte superior del servidor para facilitar la creación de operaciones masivas. Estas operaciones masivas vienen principalmente en dos sabores:

  • Operaciones masivas ordenadas . Estas operaciones ejecutan todas las operaciones en orden y fallan en el primer error de escritura.
  • Operaciones masivas desordenadas . Estas operaciones ejecutan todas las operaciones en paralelo y agregan todos los errores. Las operaciones masivas no ordenadas no garantizan el orden de ejecución.

Tenga en cuenta que para servidores anteriores a 2.6, la API convertirá las operaciones a una escala inferior. Sin embargo, no es posible realizar una conversión descendente del 100 %, por lo que puede haber algunos casos extremos en los que no pueda informar correctamente los números correctos.

En su caso, podría implementar la API masiva así:

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

-- ACTUALIZAR --

Felicitaciones a @MarkusWMahlberg, por generar contenido ficticio, es posible que desee probar el paquete mgenerate .