当循环几个记录时,mongoid显然泄漏

时间:2012-12-11 19:13:30

标签: ruby-on-rails ruby-on-rails-3 mongoid

我有一个嵌入了很多通知的用户模型,我必须遍历用户集合,然后循环遍历每个通知以删除它。

首先我得到了游标超时错误,然后使用这个步骤方法(我在某处阅读)和“仅”标准。我的实际循环代码是这样的:

per_batch = 20
users_targeted = User.only(:notifications, :slug).where(:notifications_count.gt => 40).asc(:slug)
0.step(users_targeted.count, per_batch) do |offset|
  users_targeted.limit(per_batch).skip(offset).each do |user|
    user.notifications.only(:_id).read.desc(:updated_at).skip(40).each do |n|
      n.destroy
    end
  end
end
  • 我正在使用mongoid 2.4.8
  • 用户集合约为8k
  • 每个用户最多有300个通知

现在,当循环播放3k-4k用户时,Heroku dyno的内存超出了限制并且循环停止。

有没有人知道这个问题的解决方案?我必须做很多这样的循环,所以这对我来说很麻烦。

1 个答案:

答案 0 :(得分:0)

我不确定这是否是内存泄漏,但你可以处理你的内存问题,并且通过不迭代用户集合并尝试使用批量更新删除通知来更快地完成这些工作。您应该使用$pop$inc的组合。

users = User.where(:notifications_count.gt => 40)
while users.count > 0
  User.collection.update(users.selector, 
                         {"$inc" => {notifications_count: -1}, "$pop" => {notifications: 1}} ,
                         multi: true, safe: true)
end