4

我正在尝试在 Windows 上使用 python 填充 MS SQL 2005 数据库。我正在插入数百万行,到了 700 万行,我使用了近 1 GB 的内存。下面的测试每插入 100k 行会占用 4 兆内存:

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

破解解决方案:我最终使用多处理模块生成了一个新进程来返回内存。仍然对为什么以这种方式插入行会消耗这么多内存感到困惑。有任何想法吗?

4

5 回答 5

9

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

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

于 2011-06-18T01:50:06.360 回答
1

甚至我也面临同样的问题。

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

我尝试了以下方法:

通过取消引用使用相同的游标。

关闭/打开连接

将连接设置为无。

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

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

这提供了更好的性能和更好的界面。

于 2011-05-31T09:37:39.740 回答
0

Try creating a separate cursor for each insert. Reuse the cursor variable each time through the loop to implicitly dereference the previous cursor. Add a connection.commit after each insert.

You may only need something as simple as a time.sleep(0) at the bottom of each loop to allow the garbage collector to run.

于 2010-11-04T14:17:20.160 回答
0

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

当然它不能解决任何问题,但如果你只需要这样做一次,你就可以继续生活!

于 2010-11-03T15:58:23.600 回答
0

gc.collect()您也可以尝试在导入gc模块后每隔一段时间强制进行一次垃圾收集。

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

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

于 2010-11-17T19:05:13.203 回答