Django项目吃掉了记忆

时间:2011-03-14 13:31:41

标签: django optimization memory-management

我有一个django项目,还有一个问题 - 它占用了大量内存并且负载过多。

如何找到项目中存在大量内存的问题?

3 个答案:

答案 0 :(得分:4)

如果您将Django与DEBUG = True一起使用,那么Django会记录每个可以快速挂载并使用大量内存的数据库查询。

如果您未在DEBUG模式下运行,请查看gc模块,特别是尝试将gc.set_debug(gc.DEBUG_LEAK)添加到settings.py。这将向您显示有关哪些对象正在使用内存的大量信息。

答案 1 :(得分:3)

一般来说,对于调试/分析,我建议将django-debug-toolbar作为起始位置以及各种提示:

http://docs.djangoproject.com/en/dev/topics/db/optimization/

然而,这不会给出内存使用信息。如果您确实需要,可以尝试使用pympler的一些中间件来记录内存使用情况,同时调试并运行开发服务器。

http://www.rkblog.rk.edu.pl/w/p/profiling-django-object-size-and-memory-usage-pympler/?c=1

我发现这样做会让我的webapps几乎停止运行,然后使用dev-webserver会产生问题(例如,媒体文件没有得到服务)。

但正如其他人所说,最好的办法是设置DEBUG=False

http://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory

答案 2 :(得分:1)

正如Andrew Wilkinson所说,这可能与DEBUG = True设置有关。但是,了解您是单独运行此项目还是作为Web服务器运行可能也很重要。

Django会在打开请求时自动缓存查询集,并在请求返回时删除引用。由于独立项目中没有请求,因此永远不会删除引用,因此每个请求的查询集都会被保存。

要修复独立的python问题,只需在完成一堆请求后调用django.db.reset_queries()即可。这将允许对查询集进行垃圾回收并修复泄漏。