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.
первопричина batch.execute метод асинхронной called.it никогда не выполнится, пока весь код не excuted, как я уже упоминал в моем первом вопросе. 【Также сомнения, что даже batch.execute() является асинхронной выполняется. он должен работать независимо, не зависит от основного процесса. Но я не нашел их написанными в db, а метод обратного вызова info log in не был напечатан】 , поэтому все документы, которые необходимо вставить в монго, остаются в памяти. вызывают проблему.
@joeytwiddle обнаружили, что у вас есть общее предположение по этой проблеме. bulk-upsert-in-mongodb
не обнаружено, что метод bulk.execute() может быть сконфигурирован для выполнения синхронизации. У кого-нибудь есть идея решить проблему.
попробуйте запустить приложение узла с '--max_old_space_size = 8000', например – homam
@joeytwiddle вы можете помочь посмотреть –