2016-03-20 6 views
1

Hat jemand einen Vorschlag zum Aktualisieren eines Felds in jedem Dokument in einer großen Sammlung?Große Sammlung aktualisieren

ich so etwas wie dieses:

MyModel.find().exec(function(err,data){ 
    if(err){ 
     return console.log(err); 
    } 
    data.forEach(function(doc){ 
     doc.Field = doc.Field + 1; 
     doc.save(function (err) { 
     if(err) { 
     console.error('ERROR!'); 
     } 
     }); 
    }); 
}); 

Aber ich bekomme FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory.

Gibt es eine Möglichkeit, das obige Update in Chunks oder ähnlichem zu verarbeiten?

+0

Wie groß ist Ihre Sammlung? Versuchen Sie, Speicher oder Swap-Größe des MongoDB-Servers zu erhöhen – Saleem

Antwort

3

Sie die async.eachLimit Methode der async Bibliothek verwenden können, um die Anzahl gleichzeitiger save Operationen zu begrenzen (doc Link zu each ist, nach unten scrollen, um zu sehen, die eachLimit Variante) .

Zum Beispiel zu begrenzen das spart, um nicht mehr als 5 hervorragend zu einem Zeitpunkt:

MyModel.find().exec(function(err, data){ 
    if (err) { 
     return console.log(err); 
    } 
    async.eachLimit(data, 5, function(doc, callback){ 
     doc.Field = doc.Field + 1; 
     doc.save(function(err) { 
     if (err) { 
      console.error('ERROR!'); 
     } 
     callback(err); 
     }); 
    }); 
}); 

jedoch in diesem Fall wäre es viel effizienter sein, ein einziges update mit dem $inc Operator zu verwenden und die multi: true Option jeden doc Field Wert zu erhöhen, indem 1.

MyModel.update({}, {$inc: {Field: 1}}, {multi: true), function(err) { ... }); 
+0

Noch fataler Fehler. Ich werde die andere Antwort versuchen. – user1665355

1

Sie mehr Speicher benötigen: --max_new_space_size und/oder --max_old_space_size, wie folgt aus:

node --max-old-space-size=4096 server.js 

Derzeit standardmäßig v8 hat Systeme eine Speichergrenze von 512 MB auf 32-Bit und 1,4 GB auf 64-Bit-Systemen. Das Limit kann durch Einstellung --max_old_space_size auf ein Maximum von ~ 1024 (~ 1 GB) (32-Bit) und ~ 4096 (~ 4GB) (64-Bit) erhöht werden, aber es wird empfohlen, Ihre zu teilen einziger Prozess in mehrere Arbeiter, wenn Sie Speichergrenzen treffen sind

+0

Gut zu finden. Ich war mir dessen nicht bewusst. +1 – Saleem

+0

@ profesor79 Danke, aber es sagt "Killed" nach einer Weile ... – user1665355

Verwandte Themen