2016-10-31 5 views
0
MongoClient.connect(url, function(err, db) { 
var batch = db.collection("chatmessage").initializeOrderedBulkOp(); 
//var batch = db.collection("chatmessage").db.collection.initializeUnorderedBulkOp() 
var messageNum=0; 
var chatmessage = null; 
var count =0; 
for (var i = 0;i<300;i++){ 
    messageNum = getMessage();//value from 1~500000; 
    for(var j = 0;j<messageNum;j++){ 
    count++; 
    chatmessage = generateChatMessage(); 
    batch.insert(chatmessage); 
    if(count>=1000){ 
     count=0; 
     batch.execute(function(err){ 
      console.log(err); 
      batch = db.collection("chatmessage").initializeOrderedBulkOp(); 
      console.log("batch execute"+util.inspect(process.memoryUsage())); 
      //db.close(); 
     }); 
    } 
    } 
    console.log("execute one chatroom"+util.inspect(process.memoryUsage())); 
} 
if(count>0){ 
    batch.execute(function(err){ 
      console.log(err); 
      batch = db.collection("chatmessage").initializeOrderedBulkOp(); 
     }); 
} 

}Как вставить миллионы данных в Монго с nodejs

необходимости заселить миллионы сообщений в Монго с nodejs.using Bulk метода, чтобы сделать вставки партии.

но есть некоторые вопросы по поводу кода

  • основной массы выполнить метод запуска асинхр. при вставке данных = 100 000. Не было видно, что какой-либо массовый запуск завершен, пока не завершится выполнение кода, можно увидеть, что был напечатан «пакетный запуск».

  • , когда переменная messageNum большая, около 50 000.it не будет работать.

    FATAL ERROR: Распределение CALL_AND_RETRY_LAST не удалось - процесс из памяти

переменные все определенные внешние из loop.and запустили batch.execute. не понимаю, почему это произошло.

  • , когда запись велика, rss быстро увеличивается и никогда не уменьшается. Поскольку он не управляется двигателем V8, он увеличится до достижения размера памяти моего компьютера.

Это связано с БД, когда я удаляю операцию БД, нет проблем. Я думаю, что batch.execute() methond возьмет эту память. Но не может выпустить его даже с помощью db.close();

{RSS: 1449750528, heapTotal: 1091999056, heapUsed: 922237384}

----------------------------- -------------- ОБНОВЛЕНИЕ1 ------------------------------

Имейте получили файлы snaphoot с файлами heapdump с пакетом heapdump. enter image description here

первопричина batch.execute метод асинхронной called.it никогда не выполнится, пока весь код не excuted, как я уже упоминал в моем первом вопросе. 【Также сомнения, что даже batch.execute() является асинхронной выполняется. он должен работать независимо, не зависит от основного процесса. Но я не нашел их написанными в db, а метод обратного вызова info log in не был напечатан】 , поэтому все документы, которые необходимо вставить в монго, остаются в памяти. вызывают проблему.

@joeytwiddle обнаружили, что у вас есть общее предположение по этой проблеме. bulk-upsert-in-mongodb

не обнаружено, что метод bulk.execute() может быть сконфигурирован для выполнения синхронизации. У кого-нибудь есть идея решить проблему.

+0

попробуйте запустить приложение узла с '--max_old_space_size = 8000', например – homam

+0

@joeytwiddle вы можете помочь посмотреть –

ответ

0

Я также получаю эту ошибку, но когда я использовал этот код, теперь он работает нормально. Пример простой вставки Многие операции с использованием генератора и модуля co. Вы также можете проверить;

var MongoClient = require('mongodb').MongoClient, 
co = require('co'); 
test = require('assert'); 

co(function*() { 
var db = yield MongoClient.connect('mongodb://localhost:27017/test'); 
// Get the collection 
var col = db.collection('insert_many_with_generators'); 
var r = yield col.insertMany([{a:1}, {a:2}]); 
test.equal(2, r.insertedCount); 
// Finish up test 
db.close(); 
});