我在Heroku上的Celery下运行后台任务,偶尔会出现“错误R14(超出内存配额)”和“错误R15(内存配额大大超出)”。我从数据库中加载了很多东西(通过Postgres上的Django),但它应该加载一个大对象,处理它,然后处理引用并加载下一个大对象。
我的问题是,垃圾收集器是否知道在达到Heroku的内存限制之前运行?我应该手动运行gc吗?
另一件事是我的任务有时会失败,然后Celery自动重试它,并且它成功了。它应该是确定性的。我想知道在任务完成后内存中是否存在某些东西,并且在下一个任务开始时仍占用空间。重新启动工作进程会清除内存并使其成功。也许Django或DB有一些未清除的缓存?
我使用的是标准的2倍尺寸。我可以去性能-m或性能-l,但试图避免这种情况,因为它会花费更多的钱。
答案 0 :(得分:0)
看起来问题是我没有使用.iterator()
来迭代主查询集。即使我在每次迭代后释放我正在创建的数据结构,实际的查询结果都会被缓存。
很遗憾,我无法使用.iterator()
,因为我广泛使用prefetch_related
。
我需要某种混合方法。我认为它将涉及批量处理顶级查询集。它不会完全具有prefetch_related
具有有限数量的查询的优势,但它会优于每个模型对象的一个查询。