我对MongoDB很新,并且在通过NodeJs将大量文档插入到我的集合中时遇到了一些问题。
我有一个要插入同一个集合的文件列表(全部低于100kb)。我使用以下代码:
var files = walkFolder(base);
var url = 'mongodb://localhost:27017/enron';
MongoClient.connect(url, function(err, db) {
if (err) { throw err;}
var collection = db.collection('emails');
async.each(files, function(item, callback){
var document = readEmail(item);
collection.insert(document, function(err, result) {
console.log(result);
callback(err);
});
});
});
walkFolder()
创建一个文件列表,readEmail()
将单个文件解析为JSON对象(只是一些属性,没有嵌入的文档或其他东西)
我可以执行我的程序,它可以很快地运行。但总是在集合中的61246个文档中(通过> db.emails.find().count()
检查),计数不再增加。
知道为什么会发生这种情况或如何追踪它? 一些版本:MacOS 10.9.5,NodeJs 0.10.31,MongoDB驱动程序1.4.19,MongoDB 2.6.5
答案 0 :(得分:1)
async.each
并行地将迭代器函数应用于每个files
元素。如果files
很大,您可以通过尝试一次完成所有操作来耗尽各种资源。相反,使用async.eachLimit
一次只处理N个元素。
例如,要将处理限制为一次不超过10个正在进行的文件,请将async.each
来电替换为:
async.eachLimit(files, 10, function(item, callback){ ...