我在python 3.5上使用pyodbc和pandas,以便将来自MS Access 2010的~10000行数据加载到数据框中,然后计算一些相关性。
当我尝试使用下面的代码来查看生成器的功能时,代码打印出大约9600个预期的行~10000,然后我得到了波纹管错误:
[Microsoft] [ODBC Microsoft Access Driver]查询不能 完成。查询的大小都大于最大值 数据库的大小(2 GB),或者没有足够的临时存储空间 磁盘上用于存储查询结果的空间。
**Code:**
Import pyodbc
import pandas as pd
con = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=MyDB.mdb;')
cur - con.cursor()
sql = "SELECT * from [query table]" # I have a query table which is pivoting the data inside the access.
def gen(cursor, sql):
cursor.execute(sql)
While True:
row = cursor.fetchone()
if row is None:
break
yield row
for x in gen(cur,sql):
print(x)
我已经定义了另一个函数,它获取生成器的行并将它们附加到列表然后附加到pd.Dataframe,但似乎生成器没有完成作业。
我压缩并修复了数据库,但没有运气。此外,mdb文件的大小目前不超过500mb。
您能否告诉我如何克服此错误?
非常感谢提前。
答案 0 :(得分:1)
建立连接时,pyodbc默认为autocommit=False
,符合Python的DB-API规范。因此,当执行第一个SQL语句时,ODBC开始一个数据库事务,该事务保持有效,直到Python代码在连接上执行.commit()
或.rollback()
。
显然,当您处理结果集中的行时,Access数据库引擎正在积累越来越多关于"事务"的信息,最终导致内存不足错误。将pyodbc连接设置为autocommit=True
告诉Access数据库引擎不要忘记跟踪任何与事务相关的信息,从而避免错误。