【问题标题】:mongoid apparently leaking when looping on several records循环多条记录时,mongoid 明显泄漏
【发布时间】:2012-12-11 19:13:30
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2012-11-16
      • 2011-03-06
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2011-10-03
      • 2014-05-17
      • 1970-01-01
      相关资源
      最近更新 更多