MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Brak pamięci w procesie MongoDB NodeJS

Jeśli twój serwer MongoDB ma wersję 2.6 lub nowszą, lepiej skorzystać z poleceń zapisu Bulk API które pozwalają na wykonanie bulk insert operacje, które są po prostu abstrakcjami na wierzchu serwera, aby ułatwić tworzenie operacji zbiorczych. Te operacje masowe występują głównie w dwóch wariantach:

  • Zamówione operacje zbiorcze . Te operacje wykonują wszystkie operacje w kolejności i błędach przy pierwszym błędzie zapisu.
  • Nieuporządkowane operacje zbiorcze . Operacje te wykonują wszystkie operacje równolegle i agregują wszystkie błędy. Nieuporządkowane operacje zbiorcze nie gwarantują kolejności wykonania.

Uwaga, w przypadku serwerów starszych niż 2.6 interfejs API przekonwertuje operacje w dół. Jednak nie jest możliwe przekonwertowanie w dół w 100%, więc mogą wystąpić pewne skrajne przypadki, w których nie będzie można poprawnie zgłosić prawidłowych liczb.

W Twoim przypadku możesz zaimplementować Bulk API tak:

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

-- AKTUALIZACJA --

Chwała dla @MarkusWMahlberg, za generowanie fikcyjnych treści możesz wypróbować pakiet mgenerate .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zaktualizuj kolekcję meteorów bez usuwania lub zastępowania istniejących pól

  2. Nie można połączyć się z mongodb errno:61 Połączenie odrzucone

  3. jak używać konfiguracji Spark-submit:jars,packages:w trybie klastra?

  4. wykorzystanie module.exports w nietypowy sposób

  5. Czy istnieje sposób na ograniczenie liczby rekordów w określonej kolekcji?