【问题标题】:Rails Memory leak using highChart with a lot of data使用带有大量数据的 highChart 的 Rails 内存泄漏
【发布时间】:2016-05-26 17:06:32
【问题描述】:

我的一个视图中有一个高图表图形,并且有一个选项可以选择要查询和显示在图形中的一系列日期。我的想法是,当我执行具有大日期范围(例如年份范围)的查询时,内存会增加并且它永远不会回到正常状态,最后我需要重置服务器...... 视图调用一个执行查询并返回数据数组以创建图形的类方法。最初的方法是这样的:

data = []

  messages.each do |message|
    record = []
    record << message.occurance_time.to_s(:highcharts_format)
    record << weight_according_to_metric(message.weight, us_metric_enabled)
    record << temperature_according_to_metric(message.temperature, us_metric_enabled)
    record << (message.humidity.nil? ? nil : message.humidity.to_f)
    data << record
  end

但经过一些测试后,我将 find_each 而不是 .each 并将循环包装在 ActiveRecord::Base.uncached 语句中:

data = []
ActiveRecord::Base.uncached do
  messages.find_each do |message|
    record = []
    record << message.occurance_time.to_s(:highcharts_format)
    record << weight_according_to_metric(message.weight, us_metric_enabled)
    record << temperature_according_to_metric(message.temperature, us_metric_enabled)
    record << (message.humidity.nil? ? nil : message.humidity.to_f)
    data << record
  end
end

但我仍然有记忆问题。很明显,在执行查询时内存上升,但为什么在查询和创建图形后内存没有下降?

它在 Heroku 上与 puma 一起运行!

有什么想法吗?

【问题讨论】:

  • 我认为这个问题与 ActiveRecord 的缓存无关,我相信它可能与您正在使用的 gem 有关。上面声明中的未缓存块不会给你买任何东西恕我直言
  • 无论如何,无论有没有未缓存的块,我的内存在图形创建后总是保持高位......
  • 你在什么环境下运行这个?
  • 它在 Puma 上运行并且在 Heroku 上!

标签: ruby-on-rails ruby activerecord highcharts memory-leaks


【解决方案1】:

已经有几份与 puma 和 ruby​​ 2.1 和 2.2 相关的内存泄漏报告。 ruby 垃圾收集器从 2.0 到 2.2 经历了相当多的变化:2.1 中的分代 GC,2.2 中的增量 GC。

报告的泄漏:

https://github.com/puma/puma/issues/342

https://github.com/puma/puma/issues/978

从 Ruby 2.0 升级到 2.2 后,我注意到与您描述的类似问题。经过几天毫无结果的研究和测试,我终于转向了最新的稳定版 Ruby [2.3.1]、Rails [4.2.6] 和 puma [3.4.0] 版本。泄漏消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2013-09-02
    • 2015-03-07
    • 2013-03-11
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多