在Windows中使用pyodbc进行大量插入导致内存泄漏
我正在尝试在Windows上用Python填充一个MS SQL 2005数据库。我需要插入数百万行数据,到第700万行时,内存几乎用掉了1GB。下面的测试每插入10万行就会消耗4MB的内存:
import pyodbc
connection=pyodbc.connect('DRIVER={SQL Server};SERVER=x;DATABASE=x;UID=x;PWD=x')
cursor=connection.cursor()
connection.autocommit=True
while 1:
cursor.execute("insert into x (a,b,c,d, e,f) VALUES (?,?,?,?,?,?)",1,2,3,4,5,6)
mdbconn.close()
解决办法:我最后使用了多进程模块来启动一个新进程,以释放内存。不过我还是搞不懂为什么这样插入数据会消耗这么多内存。有没有什么想法?
5 个回答
0
试着为每次插入创建一个单独的游标。在循环中每次都重新使用游标变量,这样可以自动解除对之前游标的引用。在每次插入后,加上一个连接的提交操作。
你可能只需要在每次循环的最后加一个简单的 time.sleep(0),这样可以让垃圾回收器运行一下。
1
我也遇到过同样的问题。
我需要读取超过50个XML文件,每个文件大约300MB,然后把它们加载到SQL Server 2005里。
我尝试了以下几种方法:
使用同一个游标来解引用。
关闭和重新打开连接。
把连接设置为None。
最后,我还是通过Process模块逐个加载每个XML文件。
现在我用IronPython和System.Data.SqlClient替代了这个过程。
这样做的效果更好,性能也提升了,界面也更友好。
9
我也遇到了同样的问题,看起来是pyodbc在处理带参数的插入时出现了问题:http://code.google.com/p/pyodbc/issues/detail?id=145
暂时改用静态插入,也就是直接在VALUES部分填入具体的值,这样可以解决这个问题,直到我尝试从最新的源代码构建。