我正在使用: Rails 3.0.7 jruby 1.6.7(ruby-1.8.7-p357)
并尝试以20个批次处理~360K DB记录,如下所示:
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之前不支持active_record.identity_map Ruby on Rails memory leak when looping through large number of records; find_each doesn't help
但即使只使用ActiveRecord :: Unchached也无济于事。
不确定我是否应该/如何销毁ActiveRecord对象以释放内存。请指教。感谢。