0

我有一个嵌入许多通知的用户模型,我必须遍历用户集合,然后他们遍历每个通知以删除它或不删除它。

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

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 的内存超出其限制并且循环停止。

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

4

1 回答 1

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
于 2012-12-13T15:09:23.217 回答