【发布时间】:2018-04-24 13:28:20
【问题描述】:
我正在尝试在 MS Access 数据库中生成和插入许多 (>1.000.000) 行。对于这一代,我使用 numpy 函数,因此我尝试使用 python 访问数据库。我从pyodbc开始:
import numpy as np
import pyodbc as db
connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/Users.../DataCreation.accdb;"
connection = db.connect(connection_string)
cur = connection.cursor()
k = 0
numberofdatasets=1000
for l in range(50):
params=np.empty(numberofdatasets, dtype=[('valnr', int),('val', float)])
for j in range(numberofdatasets):
params[j]= (k, somevalue generated with a numpy function)
k=k+1
params = np.array(params).tolist()
cur.executemany("INSERT INTO DataFinal VALUES (1,?,1,?);", params)
connection.commit()
connection.close()
这可行,但对我有用的时间太长了。我计时了,问题是
cur.executemany
我搜索了互联网并找到了 fast_executemany 标志。但是当我添加行时
cur.fast_executemany = True
我的内核死了。有谁知道为什么?我正在使用 64 位 Windows 10、Python 3.6、Spyder 3.2.8 和 MS Access 2016。请不要建议不使用 MS Access,我知道有更高效的数据库可以做到这一点,但现在这就是我的全部可以使用。我也知道,首先生成 numpy 数组然后将其转换为列表可能不是最好的。我的下一个尝试是 turbodbc 及其功能
cursor.executemanycolumns
但这引发了驱动程序错误,因此我认为这是一个不同的问题。感谢您提供任何帮助,但也许我应该补充一点,我刚刚开始将 Python 与数据库结合使用,我更愿意至少了解一下这个问题,而不仅仅是复制一些神秘代码:) 谢谢。
【问题讨论】:
-
当您说“我的内核死机”时,您的意思是您从 Windows 获得了 BSOD 吗?还是别的什么?
-
这行得通,但对我有用的时间太长了。 ...这是多长时间? 5 分钟? 5个小时?您需要多久插入 100 万条记录?请注意:MS Access 有一个2GB size limit。它确实可以覆盖超过 100 万,但是如果您的表格很宽,只有少数文本列,那么字节加起来!
-
@user1443098 - 不是 BSOD,而是 python.exe 中的 APPCRASH。 (至少我是这样的。)