我正在尝试使用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解决方案:我最终使用多处理模块生成一个新进程来返回内存。仍然混淆为什么以这种方式插入行消耗了如此多的内存。有什么想法吗?
答案 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()
的令人讨厌的事情是,它需要一个序列而不是一个迭代器(因此你不能将它作为生成器传递)。我先试试垃圾收集器。