<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>CIOを目指しつつの8makiのアレ &#187; MySQL</title>
	<atom:link href="http://blog.8maki.jp/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.8maki.jp</link>
	<description>俺と周りの変態リタラシーを埋める</description>
	<lastBuildDate>Sat, 28 Jan 2012 04:05:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.8maki.jp/tag/mysql/feed" />
		<item>
		<title>Python-MySQL(MySQLdb)のメモリリーク対策</title>
		<link>http://blog.8maki.jp/2009/10/python-mysql-memory-leak.html</link>
		<comments>http://blog.8maki.jp/2009/10/python-mysql-memory-leak.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 00:49:31 +0000</pubDate>
		<dc:creator>8maki</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[proposal]]></category>
		<category><![CDATA[エンジニア]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[MySQLdb]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.8maki.jp/?p=535</guid>
		<description><![CDATA[
			
				
			
		
会社のスクリプト言語がPythonに統一されて、今月からPythonをメインに使っているのですが、MySQLに接続する際なぜかものすごくメモリを食う時がありました。その備忘録。
最近技術ネタが続いていますがf^^;
結論から先に書くと、MySQLdbのfetchallの部分を下記のように書きなおすとメモリリークが起きなくなりました。

sql = &#34;SQL文&#34;
con= MySQLdb.connect(db = db, host = host, user = user, passwd = passwd)
cur = con.cursor()
cur.execute(sql, params)
result = cur.fetchall()

↓

sql = &#34;SQL文&#34;
con = MySQLdb.connect(db = db, host = host, user = user, passwd = passwd)
con.query(sql)
r = con.store_result() # use_result()も可
result = []
while(True):
　　row = r.fetch_row()
　　if not row: break
　　result.insert(0, row[0]) # 初めにデータを挿入してリストの再構成を防ぎ高速化！
con.close()

» ueBLOG  &#124; PythonをつかってMySQLの巨大な結果を返すselect文を処理する
主にこちらのブログを参考にしたのですが、cursorを使わず直接connectからクエリを投げるようにしています。
大きな違いは、一度にデータを取得するのではなく、1行ずつ取得するようにしている、ということだと思います。6～9行目で取得する行を一つ一つリストに格納しています。
なお、4行目でstore_result()を使っていますが、use_result()も可能で、use_result()を使うとデータをサーバに保持しそこから一行ずつ取得するようになるので、よりメモリの消費が抑えられる、気がしますf^^;
確認していないので何とも言えないのですが。
SQLAlchemyだとメモリリークしない、と聞いて試してみたのですが、ORマッピングで導入が面倒くさそうなうえに、生SQLを叩く際は結局MySQLdbを使うようで問題は解決しませんでした。
大量のデータをMySQLに保存しそこから全文検索（エンジンはSenna）でデータを引っ張る処理を行っていて、ある特定のSQLを書く必要があったので。
参考：
» MySQLdbのメモリー・リーク &#8211; [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.8maki.jp%2F2009%2F10%2Fpython-mysql-memory-leak.html"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.8maki.jp%2F2009%2F10%2Fpython-mysql-memory-leak.html&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p><span style="background-color: #ffffff; ">会社のスクリプト言語がPythonに統一されて、今月からPythonをメインに使っているのですが、MySQLに接続する際なぜかものすごくメモリを食う時がありました。その備忘録。</span></p>
<p>最近技術ネタが続いていますがf^^;</p>
<p>結論から先に書くと、MySQLdbのfetchallの部分を下記のように書きなおすとメモリリークが起きなくなりました。</p>
<pre class="brush: python;">
sql = &quot;SQL文&quot;
con= MySQLdb.connect(db = db, host = host, user = user, passwd = passwd)
cur = con.cursor()
cur.execute(sql, params)
result = cur.fetchall()
</pre>
<p>↓</p>
<pre class="brush: python;">
sql = &quot;SQL文&quot;
con = MySQLdb.connect(db = db, host = host, user = user, passwd = passwd)
con.query(sql)
r = con.store_result() # use_result()も可
result = []
while(True):
　　row = r.fetch_row()
　　if not row: break
　　result.insert(0, row[0]) # 初めにデータを挿入してリストの再構成を防ぎ高速化！
con.close()
</pre>
<p>» <a href="http://www.ueblog.org/blog/entry/pythonmysqldb/" target="_blank">ueBLOG  | PythonをつかってMySQLの巨大な結果を返すselect文を処理する</a><br />
主にこちらのブログを参考にしたのですが、cursorを使わず直接connectからクエリを投げるようにしています。<br />
大きな違いは、一度にデータを取得するのではなく、1行ずつ取得するようにしている、ということだと思います。6～9行目で取得する行を一つ一つリストに格納しています。</p>
<p>なお、4行目でstore_result()を使っていますが、use_result()も可能で、use_result()を使うとデータをサーバに保持しそこから一行ずつ取得するようになるので、よりメモリの消費が抑えられる、気がしますf^^;<br />
確認していないので何とも言えないのですが。</p>
<p>SQLAlchemyだとメモリリークしない、と聞いて試してみたのですが、ORマッピングで導入が面倒くさそうなうえに、生SQLを叩く際は結局MySQLdbを使うようで問題は解決しませんでした。<br />
大量のデータをMySQLに保存しそこから全文検索（エンジンはSenna）でデータを引っ張る処理を行っていて、ある特定のSQLを書く必要があったので。</p>
<p>参考：<br />
» <a href="http://d.hatena.ne.jp/perezvon/20090109/1231491515" target="_blank">MySQLdbのメモリー・リーク &#8211; スコトプリゴニエフスク通信</a><br />
» <a href="http://kjirou.sakura.ne.jp/mt/2008/12/python_mysqldb.html" target="_blank">[Python] MySQLdbのメモリリーク (それなりブログ)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.8maki.jp/2009/10/python-mysql-memory-leak.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.8maki.jp/2009/10/python-mysql-memory-leak.html" />
	</item>
	</channel>
</rss>

