2016-05-26 21 views
2

我在我的一個視圖中有一個高圖形和一個選項來選擇一個日期範圍來查詢和顯示在圖形中。這個想法是當我執行一個日期範圍很大的查詢時(例如一年範圍),內存增加,它永遠不會回到正常狀態,最後我需要重置服務器... 視圖調用一個類方法執行查詢並返回數據數組以創建圖形。該方法最初是這樣的:Rails內存泄漏使用HighChart與大量的數據

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而不是。每和我包裹的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一起運行!

有什麼想法?

+0

我不認爲這個問題必須與ActiveRecord的緩存相關,我相信它可能與您正在使用的寶石有關。上面聲明中的未緩存塊不會給你買任何東西IMHO –

+0

無論如何,有或沒有未緩存的塊,我的內存在圖形創建後總是保持高位... – matiasdim

+0

你在什麼環境中運行它? – slocumro

回答

1

有幾個關於puma和ruby 2.1和2.2的內存泄漏的報告。紅寶石垃圾收集器經歷了從2.0到2.2的相當多的變化:2.1的Generational GC,2.2的Incremental 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]發佈。泄漏消失了。