【发布时间】:2019-09-29 13:17:05
【问题描述】:
python-2.7.15、pymssql-2.1.4、SQL_Server-2018、Windows 10 专业版、MS-Office-2016
import time
import csv
import pymssql
db_settings = {
"host" : "127.0.0.1",
"port" : "1433",
"user" : "sa",
"password" : "********",
"database" : "testdb",
"charset" : "utf8"
}
conn = pymssql.connect(**db_settings)
cursor = conn.cursor()
ff = csv.reader(open('base.csv', 'r'))
sql = """
BEGIN
INSERT INTO Base([name], [year], [update], [status],
[timeline], [language], [pic]) VALUES (%s, %s, %s, %s, %s, %s, %s)
END
"""
now=time.strftime("%M:%S")
t = []
for i in ff:
i = i[1:]
if "year" in i:
pass
else:
t.append((i[0], i[1], i[3], i[4], i[6], i[5], i[8]))
cursor.executemany(sql, t)
conn.commit()
end=time.strftime("%M:%S")
print(now+","+end)
“base.csv”文件大小为 21.7 MB 和 30374 行。当我执行上述代码时,需要 929 秒才能完成。这意味着只有 32.7 行/秒,太慢了。谁能帮我找出原因?非常感谢。 :-)
【问题讨论】:
-
你能在 for 循环检查年份之后插入另一个打印的时间吗?我怀疑不是插入需要这么长时间,而是字符串比较......
-
我尝试删除代码中的for循环,耗时928秒,for循环只想删除base.csv中的第一行
-
嗯... csv 是机密文件还是您可以在此处共享该数据?我想自己尝试使用代码做一些事情,但是在没有原始数据的情况下这样做可能会产生非常不同的结果。
-
您可以在进入
for i in ff:循环之前跳过带有next(ff, None)的标题行。这样你就不必检查每一行。你真的要插入本地数据库实例(127.0.0.1)吗?当我为 100,000 行 x 4 列执行此操作时,我使用 pymssql 获得大约 695 行/秒(使用 pyodbc、“SQL Server 的 ODBC 驱动程序 17”和fast_executemany=True获得大约 5,000 行/秒)。 -
( cc: @sekky ) - 我刚刚再次尝试使用您的 30,374 行测试数据。我使用 pymssql 获得了 2,336 行/秒,使用 pyodbc+fast_executemany 获得了 7,594 行/秒。很明显,您的环境中发生了一些您没有向我们展示的其他事情。
标签: python sql-server-2012 pymssql executemany