我正在使用:Rails 3.0.7 jruby 1.6.7 (ruby-1.8.7-p357)
并尝试以 20 条为一组处理约 36 万条数据库记录,如下所示:
BackJobs.find_in_batches(:conditions => "progress = -1", :batch_size => 20) do |all_pending_jobs|
all_pending_jobs.each do |job|
pending_jobs.push(job)
end
但是一段时间后继续出现异常:
ActiveRecord::StatementInvalid: Java::JavaLang::OutOfMemoryError: GC overhead limit
exceeded: SELECT "background_jobs".* FROM "background_jobs" WHERE (progress = -1)
AND ("background_jobs"."id" > 45256) ORDER BY "background_jobs"."id" ASC LIMIT 20
该进程使用这些 JVM 设置运行:-Xmx256m -Xss2048k
据我了解,直到 rails 3.1.0 Ruby on Rails 循环大量记录时才支持 active_record.identity_map 内存泄漏;find_each 没有帮助
但即使只使用 ActiveRecord::Unchached 也无济于事..
不确定我是否应该/如何销毁 ActiveRecord 对象以释放内存。请指教。谢谢。