【问题标题】:How to reduce memory consumption (RAM) on Python/Django project?如何减少 Python/Django 项目的内存消耗(RAM)?
【发布时间】:2020-12-31 06:43:27
【问题描述】:

我在 Django DRF API 项目上的内存使用量随着时间的推移而增加,并且一旦我达到 50 次以上的 API 调用,RAM 就会被填满。

到目前为止我尝试过

  • 预先加载所有模型,类变量
  • 使用memory profiler,尽可能清理代码以减少变量使用
  • 在代码开头添加了garbage collection:gc.disable() 和代码末尾的gc.enable()
  • 在代码等末尾添加了ctypesmalloc.trim()
  • 设置gunicorn max-requests 限制(这会导致此时更多的模型加载/响应时间)

关于如何在每个请求结束时释放内存有什么建议吗?

【问题讨论】:

  • 垃圾收集器只会在没有对数据的引用时从内存中删除数据。确保您确实需要减少消耗,因为如果需要,内存很可能会返回给系统。

标签: python django memory-management memory-leaks gunicorn


【解决方案1】:

由于 CPython 解释器管理内存的方式,它很少真正释放任何分配的内存。一般来说,CPython 进程的内存使用量会不断增长

由于您使用的是 Gunicorn,您可以设置 max_requests 设置,该设置将定期重启您的工作人员并缓解一些“内存泄漏”问题

【讨论】:

  • 谢谢,但一旦达到 max_requests 限制,就会导致服务停机/模型重新加载。
  • @Sreejithc321 如果你有足够的工人,那么工人重新装货应该不是问题,因为会有其他人来填补空缺。您的应用需要多长时间才能加载?为什么要花费大量时间?
  • 有 4 名工人,预先加载基于 ML 的模型,加载时间约为 5 分钟。
  • @Sreejithc321 好的哇,API 服务器启动时间太长了。 Django 进程中是否发生任何实际计算/处理?如果不是,那么可能值得将结果转储到数据库并从那里提供 API?
  • 是的,某些图像/文本处理是在 api 调用上完成的,并返回结果。这也需要实时提供。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2018-11-29
相关资源
最近更新 更多