我有或多或少看起来像这样的 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 行) 。即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