MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Процесът на MongoDB NodeJS няма памет

Ако вашият MongoDB сървър е 2.6 или по-нов, би било по-добре да се възползвате от използването на команди за запис Bulk API които позволяват изпълнението на групово вмъкване операции, които са просто абстракции на върха на сървъра, за да улеснят изграждането на групови операции. Тези групови операции се предлагат главно в два варианта:

  • Поръчани групови операции . Тези операции изпълняват всички операции по ред и извеждат грешка при първата грешка при запис.
  • Неподредени групови операции . Тези операции изпълняват всички операции паралелно и агрегират всички грешки. Неподредените групови операции не гарантират ред на изпълнение.

Имайте предвид, че за по-стари сървъри от 2.6 API ще преобразува операциите надолу. Въпреки това не е възможно да се преобразува надолу 100%, така че може да има някои крайни случаи, при които не може да отчете правилно точните числа.

Във вашия случай бихте могли да внедрите API за групово приложение като това:

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

-- АКТУАЛИЗАЦИЯ --

Браво на @MarkusWMahlberg, за генериране на фиктивно съдържание може да опитате пакета mgenerate .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Конфигурация на Rails, Mongoid и Unicorn за Heroku

  2. Множество групови операции, използващи рамката за агрегиране на Mongo

  3. Намиране на документи по масив от DBRefs

  4. Използване на библиотека mongodb-stitch в Angular 4

  5. Mongodb C# драйвер - не може да използва удостоверяване на администратор за достъп до други бази данни