Python 在select语句之后提交时pyodbc内存泄漏
我遇到了pyodbc的内存泄漏问题。我花了很多时间才找到。最后我得到了一段发生内存泄漏的代码Python 在select语句之后提交时pyodbc内存泄漏,python,mysql,memory-leaks,pyodbc,Python,Mysql,Memory Leaks,Pyodbc,我遇到了pyodbc的内存泄漏问题。我花了很多时间才找到。最后我得到了一段发生内存泄漏的代码 import pyodbc conn = pyodbc.connect(myconnstr) cur = conn.cursor() for i in range(1000000): print i cur.execute('select * from test.aa;') cur.fetchall() cur.commit() 如果我运行这段代码,它会以大约5mb/秒
import pyodbc
conn = pyodbc.connect(myconnstr)
cur = conn.cursor()
for i in range(1000000):
print i
cur.execute('select * from test.aa;')
cur.fetchall()
cur.commit()
如果我运行这段代码,它会以大约5mb/秒的速度慢慢消耗内存。但是,如果像下面那样删除最后一行,它就不会泄漏内存。在迭代中关闭光标和连接没有帮助。如果内存泄漏发生,关闭光标和连接将无法恢复内存
import pyodbc
conn = pyodbc.connect(myconnstr)
cur = conn.cursor()
for i in range(1000000):
print i
cur.execute('select * from test.aa;')
cur.fetchall()
但是,如果用insert语句替换select,则不会泄漏内存:
import pyodbc
conn = pyodbc.connect(myconnstr)
cur = conn.cursor()
for i in range(1000000):
print i
cur.execute('insert into test.aa values(1);')
cur.commit()
我试着用guppy追踪漏洞,但是没有用。使用hpy().heap()可以得到以下结果:
Partition of a set of 286322 objects. Total size = 22433376 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 115601 40 8825424 39 8825424 39 str
1 69891 24 3030424 14 11855848 53 tuple
2 1921 1 1352588 6 13208436 59 dict (no owner)
3 1074 0 1349016 6 14557452 65 dict of PyQt4.QtCore.pyqtWrapperType
4 477 0 1189980 5 15747432 70 dict of module
5 12326 4 887472 4 16634904 74 types.CodeType
6 12178 4 730680 3 17365584 77 function
7 1162 0 565496 3 17931080 80 dict of type
8 1162 0 523384 2 18454464 82 type
9 1074 0 502632 2 18957096 85 PyQt4.QtCore.pyqtWrapperType
<1140 more rows. Type e.g. '_.more' to view.>
一组286322对象的分区。总大小=22433376字节。
索引计数%Size%累计%Kind(类/类的目录)
0 115601 40 8825424 39 8825424 39街
1 69891 24 3030424 14 11855848 53元组
2 1921 1 1352588 6 13208436 59 dict(无所有者)
3 1074 0 1349016 6 14557452 65 PyQt4.QtCore.pyqtWrapperType的dict
4 477 0 1189980 5 15747432 70模块目录
5 12326 4 887472 4 16634904 74类型。代码类型
612178 4 730680 3 17365584 77功能
7 1162 0 565496 3 17931080 80型目录
81162052338421845446482型
9 1074 0 502632 2 18957096 85 PyQt4.QtCore.pyqtWrapperType
它说只占用了22mb的内存,但实际上python进程目前使用了大约500mb的内存
我正在使用32位python 2.7.2(随python(x,y)2.7.2.3一起提供),并使用.exe安装程序手动安装了pyodbc 32位3.0.6。哦,我使用的是MySQL 5.5.17 32位
以前有人遇到过这个问题吗?任何意见都将不胜感激。非常感谢
哦,我忘了告诉你我在select语句之后提交的原因是我正在为sql操作编写包装器。我无法从语句中判断它是select还是insert,所以我为每个语句提取并提交,只是为了确保一切都完成了。如果有一种很好的方法可以在select/insert/update/show之间进行区分,我想我可以避免这个内存泄漏问题。我还没有找到修复方法,但确实找到了解决方法。我只在我们的一些机器上遇到问题。在您的代码片段的帮助下,我能够缩小这些代码的范围,然后注意到所有这些代码都出现在使用MySQL ODBC连接器版本5.2的where上,而那些代码在使用5.1的where上没有泄漏。这在Windows和Linux上都发生过 有泄漏的机器降级到5.1似乎已经解决(或至少避免)了问题。可能需要提交问题供开发人员审查。