<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IGI&#039;s Blog &#187; python</title>
	<atom:link href="http://www.igigo.net/archives/category/python/feed" rel="self" type="application/rss+xml" />
	<link>http://www.igigo.net</link>
	<description></description>
	<lastBuildDate>Fri, 09 Dec 2011 04:19:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
	
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://www.igigo.net/wp-includes/js/jquery/jquery.js?ver=1.4.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>Django&quot;内存泄漏&quot;的问题</title>
		<link>http://www.igigo.net/archives/66</link>
		<comments>http://www.igigo.net/archives/66#comments</comments>
		<pubDate>Thu, 04 Mar 2010 07:16:28 +0000</pubDate>
		<dc:creator>igi</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://www.igigo.net/?p=66</guid>
		<description><![CDATA[python django 内存泄漏]]></description>
			<content:encoded><![CDATA[<p>这几天一直在忙着赶项目，一个基于django的日志分析系统，之前已经有基本的雏形，这一次主要是给它做代码的整理及重构部分模块.为了保持代码的一致性，除了Web部分用了django，后台程序与数据库的交互也采用了django的框架. 我在后台python脚本模块中，直接import了django的models</p>
<pre class="brush: python; title: ;">
import sys
from django.core.management import setup_environ
sys.path.append('/test/web_site/')
import settings
setup_environ(settings)
from mysql.models import *
</pre>
<p>通过这样，后台其他程序就可以直接通过django与数据库打交道，处理日志的守护进程也是这么做的，但随着运行时间的加长，我发现进程所占用的内存越来越大. 内存泄漏~! 我的程序逻辑并不复杂，唯一有内存泄漏的可能也就是不断重复执行的一个循环，几行代码，但我看了好久也没发现有问题的地方. 而且python的内存管理机制相当自动化，极少有出现内存无法释放的问题，常见的range(n)和交叉引用导致的内存不回收的情况，代码中并没有采用. 这让我十分疑惑</p>
<p>只能硬着头皮调试，几行代码，我就没用啥高级的调试方法，直接一行行的注释掉来观察，最后发现是django的数据库API导致的.如</p>
<pre class="brush: python; title: ;">
from mysql.models import test_log as logtable
p=logtable(times=valuedic['times']，ipadd=valuedic['ipadd'])
p.save()
</pre>
<p>在p.save()，把数据插入数据库后，这一部分的内存就不会释放了，加上del p 或者p = None都无济于事. 搜来搜去也没发现其他人有遇到类似的问题，幸福的是最后我还是在一篇e文中找到了点线索</p>
<p>原文地址:<a href="http://blog.webfaction.com/tips-to-keep-your-django-mod-python-memory-usage-down">http://blog.webfaction.com/tips-to-keep-your-django-mod-python-memory-usage-down</a></p>
<p>文中第一条就提到:Make sure that you set DEBUG to False in settings.py，在DEBUG模式下，所有的SQL查询都会被保存在内存中.<br />
我顿时想起，由于我整个项目还在调试阶段，这个DEBUG变量是设置为True的</p>
<p>DEBUG设置为False后，内存泄漏的问题就不复存在了</p>
<p>可我整个项目还需要调试，不能就这么简单的关闭DEBUG模式，怎么办? 我一开始想在后台模块import settings后再重新设置DEBUG变量</p>
<pre class="brush: python; title: ;">
import sys
from django.core.management import setup_environ
sys.path.append('/test/web_site/')
import settings
settings.DEBUG = False
setup_environ(settings)
from mysql.models import *
</pre>
<p>可经过测试，这样做并无法生效，怎么回事? 原来setup_environ时把整个模块都传过去了，这样的方法行不通.</p>
<p>最后我用了折衷的方法， copy一份settings，等项目完工后，再把原settings的DEBUG关闭就可以了</p>
<pre class="brush: python; title: ;">
import sys
from django.core.management import setup_environ
sys.path.append('/test/web_site/')
import settings_for_db as settings
setup_environ(settings)
from mysql.models import *
</pre>
<p>之所以标题用引号，因为这只是一个DEBUG模式下django的特性，不是真正的内存泄漏.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.igigo.net/archives/66/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

