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

How to clear memory for a long running rake task to prevent exceeding Heroku's memory quota?

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

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

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

我明白为什么这是一项内存密集型任务,但我想知道是否有人可以指出正确的方向,说明在处理和保存每条记录(甚至每 100 条记录之后)。

Alternatively/additionally有没有办法在Heroku任务自动终止后自动重启?

是否遍历每条记录,可以强制启动 GC:

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