我有一个rake任务,我需要在后台运行Heroku作为一项任务。然而,任务非常大,我遇到了错误R14(超出内存配额),并希望我能得到一些关于如何避免这种情况的提示。
本质上,该任务查看Products表并查找没有图像Product.where(images: nil)
的产品。
然后任务循环每个条目;使用product.url
它会打开与远程网站的连接(使用Nokogiri)并提取图像和一些其他数据。使用mini_magick调整图像大小并使用carrierwave保存到S3 Bucket。
我有大约39000条需要处理的记录,但在大约500条记录之后,我收到了“内存配额超出”错误,任务停止。
我可以看出为什么这是一个非常耗费内存的任务,但我想知道是否有人能指出我在每个记录处理和保存后(甚至每次记录后)如何清理内存的正确方向100条记录)。
或者/另外还有一种方法可以在Heroku任务自动终止后自动重启它吗?
答案 0 :(得分:1)
您是否迭代每条记录,可以强制GC启动:
Products.where(images: nil).each_with_index do |image, index|
if index % 100 == 0
GC.start
end
end