我在mongodb中有一个多个不必要的大型和无组织的集合,我正在尝试将该数据的一个子集迁移到一些具有mongoose模式的新集合。但是,我的方法似乎有内存泄漏,因为迁移缓慢停止并且节点进程在一段时间后占用了所有RAM。导致此错误:
FATAL ERROR: JS Allocation failed - process out of memory
我从我要迁移的文档列表people
开始。最初,我使用了forEach
而不是people
,但是这导致了很大的内存泄漏,在关闭之前创建了许多cursors
。然后我尝试使用async来串行生成每个查询,这比我最初的尝试要好得多,但是仍然存在轻微的内存泄漏,并且最终只在一小部分数据发生后发生错误迁移。我错过了什么?
var PersonSchema = new mongoose.Schema({
_id: String,
records: [{
id: String
date: Date
}]
});
var Person = mongoose.model('Person', PersonSchema);
db = mongoose.connection.db;
// Collections I want to use to use in populating new schema
var members = db.collection('members');
var records = db.collection('records');
// Populate members
members.find().each(function (err, p) {
if (err) {
winston.error(err);
}
if (p) {
var id = p['Member ID - Consist'];
var person = new Patient({
_id: id,
records: []
});
person.save(function (err) {
if (err) {
winston.error(err);
} else {
winston.info('Saved %s', id);
}
});
} else {
winston.info('Done importing members');
}
});
// Loop through people again and add all their records
Person.find().exec(function (err, people) {
async.eachSeries(people, function (p, callback) {
var cursor = records.find({
'memberId': p.id
});
cursor.each(function (err, doc) {
if (err) {
throw new Error(err);
}
if (doc) {
p.records.push({
id: doc['recordId'],
date: new Date(doc['date'])
});
} else {
p.save(function (err) {
if (err) {
winston.error(err);
} else {
cursor.close(function () {
callback();
});
winston.info('Data saved for %s', p.id);
}
});
}
});
}, function (err) {
console.log(err);
});
});