Python 在select语句之后提交时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/秒

我遇到了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()
但是,如果用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似乎已经解决(或至少避免)了问题。

可能需要提交问题供开发人员审查。