为什么迭代数据导致大量内存使用?

时间:2014-01-26 17:52:14

标签: ruby-on-rails memory memory-management rails-activerecord delayed-job

我有十个users,每个path个项目有数千个(计数正好是98956,6954,159732,0,40176,541819,218012,52380,93203和432) 。我需要遍历每个user,并使用他们的paths。我发现每次迭代都会增加内存使用量,只有少数用户使用的是超过1 GB的RAM。

我已经将代码简化为仅收集paths,并且仍在进行过多的内存使用:

User.find_each do |user|
  points = user.paths.map { |path| [path.latitude, path.longitude, path.id] }
end

作为一个侧面说明,我也遇到了delayed_job过多的内存使用情况,我为每个用户分配了一份工作。因此,不是使用User.find_each do |user|收集多个用户,而是仅使用user = User.find(id)抓取一个用户。内存使用量从一个作业增加到另一个作业,直到最终delayed_job退出(并且我无法找到与此相对应的任何日志记录 - 它只是消失了)。

我可以做些什么来管理内存使用吗?

我正在使用ruby-1.9.3-p484和Rails 3.2.16

1 个答案:

答案 0 :(得分:3)

我认为您使用find_each错了!由于您拥有太多路径的用户太少,请尝试使用find_each迭代用户的路径,这样就不会将用户的所有路径都加载到内存中。

User.find_each do |user|
  points = []
  user.paths.find_each { |path| points << [path.latitude, path.longitude, path.id] }
end