0

J'ai une tâche de ratissage que je dois exécuter sur Heroku en tâche de fond. Cependant, les tâches sont assez importantes et je rencontre une erreur R14 (Memory Quota Exceeded) et espérais que je pourrais obtenir quelques conseils sur la façon dont je peux éviter cela. Essentiellement, la tâche examine la table Produits et trouve les produits qui n'ont pas d'image. Product.where(images: nil). La tâche parcourt ensuite chaque entrée; en utilisant product.url il ouvre une connexion à un site Web distant (en utilisant Nokogiri) et tire les images et quelques données supplémentaires. Les images sont redimensionnées à l'aide de mini_magick et enregistrées dans un compartiment S3 à l'aide de l'onde porteuse. J'ai environ 39000 enregistrements qui ont besoin de traitement, mais après environ 500, l'erreur Memory Quota Exceeded est dépassée et la tâche s'arrête.Comment effacer la mémoire d'une tâche de rake de longue durée pour éviter de dépasser le quota de mémoire de Heroku?

Je comprends pourquoi cette tâche demande beaucoup de mémoire, mais je me demandais si quelqu'un pouvait me diriger dans la bonne direction pour savoir comment nettoyer la mémoire après que chaque enregistrement ait été traité et sauvegardé (ou même après tous les 100 enregistrements).

Alternativement/en plus existe-t-il un moyen de redémarrer automatiquement la tâche Heroku après qu'elle se termine automatiquement?

Répondre

0

vous itérer sur chaque enregistrement, vous pouvez forcer le GC pour commencer:

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

Ouais! Cela ressemble à un pas dans la bonne direction. Merci! Donc, fondamentalement, cela débuterait la collecte des ordures tous les 100 enregistrements? Cela peut-il être fait en utilisant 'in_batches' au lieu de' each_with_index'. Peut-être un peu hors de portée, mais avez-vous des conseils sur la recherche du nombre optimal ou des enregistrements avant de faire un GC? (ie articles, gemmes, etc) – 8bithero

+0

Jamais essayé avec in_batches, mais il ne voit pas pourquoi cela ne devrait pas fonctionner :-) Pour trouver le nombre optimal d'enregistrements, j'imprimerais GC.stats pour différentes tailles de lots et voir la sortie. Trouvé cet article expliquant GC.stats https://www.speedshop.co/2017/03/09/a-guide-to-gc-stat.html –

+0

Merci beaucoup! :) – 8bithero