我有Ruby代碼是或多或少這個樣子的紅寶石不釋放內存
offset = 0
index = 1
User.establish_connection(..) # db1
class Member < ActiveRecord::Base
self.table_name = 'users'
end
Member.establish_connection(..) #db2
while true
users = User.limit(10000).offset(offset).as_json ## for a Database 1
offset = limit * index
index += 1
users.each do |u|
member = Member.find_by(name: u[:name])
if member.nil?
Member.create(u)
elsif member.updated_at < u[:updated_at]
member.update_attributes(u)
end
end
break if break_condition
end
我所看到的是,RSS內存(HTOP)保持增長,並在一個點上達到10GB。我不確定爲什麼會發生這種情況,但內存似乎永遠不會被Ruby釋放回操作系統。
我知道有一個很長的問題列表與此內聯。我甚至嘗試通過代碼改變看起來像這樣(最後3行專門).i.e手動運行GC.start
結果仍然相同。
while true
....
...
...
users = nil
GC.start
break if break_condition
end
測試了這個關於Ruby版本2.2.2
和2.3.0
編輯:其他細節
1)操作系統。
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.04
DISTRIB_CODENAME=vivid
DISTRIB_DESCRIPTION="Ubuntu 15.04"
2)ruby通過rvm安裝並編譯。
3)ActiveRecord的版本4.2.6
'什麼時候?你是不是指'while'? – matt
'或多或少看起來像這樣'也許最好是顯示確切的代碼? – fl00r
@ fl00r準確的代碼期望班級或模型名稱已更改 – Viren