如何为长时间运行的rake任务清除内存以防止超出Heroku的内存配额?

时间:2017-09-30 14:19:22

标签: ruby-on-rails heroku memory-leaks out-of-memory rake-task

我有一个rake任务,我需要在后台运行Heroku作为一项任务。然而,任务非常大,我遇到了错误R14(超出内存配额),并希望我能得到一些关于如何避免这种情况的提示。

本质上,该任务查看Products表并查找没有图像Product.where(images: nil)的产品。 然后任务循环每个条目;使用product.url它会打开与远程网站的连接(使用Nokogiri)并提取图像和一些其他数据。使用mini_magick调整图像大小并使用carrierwave保存到S3 Bucket。

我有大约39000条需要处理的记录,但在大约500条记录之后,我收到了“内存配额超出”错误,任务停止。

我可以看出为什么这是一个非常耗费内存的任务,但我想知道是否有人能指出我在每个记录处理和保存后(甚至每次记录后)如何清理内存的正确方向100条记录)。

或者/另外还有一种方法可以在Heroku任务自动终止后自动重启它吗?

1 个答案:

答案 0 :(得分:1)

您是否迭代每条记录,可以强制GC启动:

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