【发布时间】:2014-08-28 12:57:57
【问题描述】:
我有一个 Node.js 应用程序,用于将记录从 MySql 迁移到 MongoDB。我正在使用 Mongoose 和 async.js 来执行此操作,并且我注意到一些我不理解的行为。如果我有以下 Coffeescript 代码 (javascript here):
# users is a collection of about 70k records
async.each users, ((user, callback) =>
# console.log "saving user: #{user.id} of #{users[users.length-1].id}"
model = new User
id: user.id
name:
first: user.fname
last: user.lname
model.save (err) ->
console.log "saving user: #{user.id}"
model = null
callback(err)
), (err) ->
users = null
callback(err)
model.save 的回调永远不会到达,我的 Node 进程将慢慢爬升至 1.5gb。如果我检查我的 mongodb 实例,我可以看到在处理完 users 集合中的所有 70k 项之后,记录将开始保存到 mongodb,但它们在 41k 左右停止。
我注意到,如果我从async.each 切换到async.eachSeries,则每条记录都会调用model.save,并且迁移成功完成。
我假设出于某种原因,Node 在执行 model.save 的回调之前,会针对 users 集合中的每个项目运行 async.each 的每次迭代,这会导致内存问题,但我不明白这是为什么。谁能告诉我为什么 Node 会这样做,以及为什么切换到 async.eachSeries 可以解决这个问题?
【问题讨论】:
-
可能是mongodb驱动遇到了并发问题,你试过用
async.queue代替each吗?
标签: node.js mongodb coffeescript mongoose async.js