我有十个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
答案 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