MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB NodeJS Processo di memoria insufficiente

Se il tuo server MongoDB è 2.6 o più recente, sarebbe meglio sfruttare i comandi di scrittura API in blocco che consentono l'esecuzione di inserimento collettivo operazioni che sono semplicemente astrazioni sulla parte superiore del server per semplificare la creazione di operazioni in blocco. Queste operazioni sfuse sono disponibili principalmente in due gusti:

  • Operazioni in blocco ordinate . Queste operazioni eseguono tutte le operazioni in ordine ed escono dal primo errore di scrittura.
  • Operazioni in blocco non ordinate . Queste operazioni eseguono tutte le operazioni in parallelo e aggregano tutti gli errori. Le operazioni in blocco non ordinate non garantiscono l'ordine di esecuzione.

Nota, per i server più vecchi di 2.6 l'API eseguirà il downconvert delle operazioni. Tuttavia non è possibile effettuare una conversione al 100%, quindi potrebbero esserci alcuni casi limite in cui non è possibile riportare correttamente i numeri corretti.

Nel tuo caso, potresti implementare l'Bulk API così:

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

-- AGGIORNAMENTO --

Complimenti a @MarkusWMahlberg, per aver generato contenuti fittizi potresti provare il pacchetto mgenerate .