Windows中的Python:使用pyodbc的大量插入会导致内存泄漏

时间:2010-11-03 15:54:36

标签: python memory-leaks pyodbc

我正在尝试使用Windows上的python填充MS SQL 2005数据库。我正在插入数百万行,而且我正在使用几乎一千兆字节的内存。下面的测试每插入100k行就会占用4兆的RAM:

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()

Hack解决方案:我最终使用多处理模块生成一个新进程来返回内存。仍然混淆为什么以这种方式插入行消耗了如此多的内存。有什么想法吗?

5 个答案:

答案 0 :(得分:8)

我遇到了同样的问题,它看起来像参数化插入的pyodbc问题:http://code.google.com/p/pyodbc/issues/detail?id=145

暂时切换到填充了VALUES子句的静态插入消除了泄漏,直到我尝试从当前源构建。

答案 1 :(得分:1)

即使我遇到了同样的问题。

我必须阅读50多个XML文件,每个文件大约300 MB,并将它们加载到SQL Server 2005中。

我尝试了以下内容:

通过解除引用使用相同的光标。

关闭/打开连接

将连接设置为无。

最后使用Process模块​​最终引导每个XML文件加载。

现在我已经使用IronPython - System.Data.SqlClient替换了该进程。

这样可以提供更好的性能和更好的界面。

答案 2 :(得分:0)

也许关闭&每百万行左右重新打开连接?

当然,它没有解决任何问题,但如果你只有这样做,你就可以继续生活!

答案 3 :(得分:0)

尝试为每个插入创建单独的游标。每次通过循环重用游标变量以隐式取消引用前一个游标。每次插入后添加connection.com。

您可能只需要在每个循环底部的time.sleep(0)这样简单的东西,以允许垃圾收集器运行。

答案 4 :(得分:0)

导入gc.collect()模块后,您还可以尝试使用gc强制执行垃圾回收。

另一种选择可能是使用cursor.executemany()并查看是否可以解决问题。然而,关于executemany()的令人讨厌的事情是,它需要一个序列而不是一个迭代器(因此你不能将它作为生成器传递)。我先试试垃圾收集器。

编辑:我刚刚测试了你发布的代码,我没有看到同样的问题。你使用旧版本的pyodbc吗?