1

私が使用している: 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

私が理解している限り、active_record.identity_map は Rails 3.1.0 までサポートされていません 。多数のレコードをループすると、Ruby on Rails のメモリ リークが発生します。find_each は役に立たない

しかし、ActiveRecord::Unchached だけを使用しても役に立ちません。

ActiveRecord オブジェクトを破棄してメモリを解放する必要があるかどうか、またはその方法がわかりません。お知らせ下さい。ありがとう。

4

0 に答える 0