【问题标题】:Why does iterating over data result in massive memory usage?为什么迭代数据会导致大量内存使用?
【发布时间】:2014-01-26 17:52:13
【问题描述】:

我有十个users,每个都有数千个(计数正好是 98956、6954、159732、0、40176、541819、218012、52380、93203 和 432)path 项目。我需要遍历每个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) 抓住一个用户。内存使用量随着作业的增加而增长,直到最终延迟_作业退出(而且我无法找到与此相对应的任何日志记录 - 它只是消失了)。

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

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

【问题讨论】:

  • 你使用的是什么版本的 Ruby?

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


【解决方案1】:

我觉得你用find_each错了!由于路径很多的用户太少,请尝试使用 find_each 迭代用户的路径,以便不会将用户的所有路径都加载到内存中。

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

【讨论】:

猜你喜欢
  • 2012-02-09
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多