1

我正在使用: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 对象以释放内存。请指教。谢谢。

4

0 回答 0