从现有集合迁移到新的mongoose集合时发生内存泄漏

时间:2014-04-16 06:42:46

标签: node.js mongodb memory-management mongoose node-mongodb-native

我在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);
  });
});

0 个答案:

没有答案