2017-09-30 12 views
0

私はバックグラウンドでHeroku上で実行する必要があるレーキタスクを1つのタスクとして持っています。しかし、タスクはかなり大きく、私は 'Error R14(Memory Quota Exceeded)'を実行し、これを避ける方法についていくつかのヒントを得ることができると考えていました。Herokuのメモリクォータを超えないように、長時間実行されるレーキタスクのメモリをクリアするにはどうすればよいですか?

本質的に、タスクはProductsテーブルを参照し、画像がない製品を見つけますProduct.where(images: nil)。 タスクは各エントリを順番に繰り返します。 product.urlを使用して(Nokogiriを使用して)リモートWebサイトへの接続を開き、イメージといくつかの追加データを取得します。画像はmini_magickを使用してサイズ変更され、搬送波を使用してS3バケットに保存されます。

私は処理が必要な約39000レコードがありますが、約500後にメモリクォータ超過エラーが発生し、タスクが停止します。

私はこれがかなりメモリ集中的な仕事である理由を知ることができますが、誰かが私が各レコードが処理され、保存された後にどのようにメモリをクリーンアップできるかについて、 100レコードごと)。

また、自動的に終了した後にHerokuタスクを自動再起動する方法はありますか?

答えて

0

あなたは、各レコードを反復です、あなたが開始するためにGCを強制することができます:

Products.where(images: nil).each_with_index do |image, index| 
    if index % 100 == 0 
    GC.start 
    end 
end 
+0

をうん!それは私が正しい方向に歩むように見えます。ありがとう!ですから、基本的に100レコードごとにガベージコレクションを開始しますか?これは、 'each_with_index'の代わりに' in_batches'を使って行うこともできます。おそらく範囲外ですが、GCを実行する前に最適な数値やレコードを見つけるためのヒントはありますか? – 8bithero

+0

in_batchesで試したことはありませんが、なぜ動作しないのか分かりません:-) 最適なレコード数を見つけるには、GC.statsをさまざまなバッチサイズで印刷し、出力を参照してください。この記事はGC.statsを説明しています https://www.speedshop.co/2017/03/09/a-guide-to-gc-stat.html –

+0

ありがとうございました! :) – 8bithero

関連する問題