pyodbc connection.close()与Access数据库非常慢

时间:2019-03-29 19:06:52

标签: python ms-access pyodbc

我正在使用pyodbc打开与Microsoft Access数据库文件(.accdb)的连接,并运行SELECT查询以创建熊猫数据框。我从here获得了ODBC驱动程序。我在检索和处理数据方面没有任何问题,但是在代码末尾关闭连接可能需要10到15秒,这很烦人。省略conn.close()可以解决我的问题,以前的研究表明,关闭连接并不重要,因为我是唯一访问文件的人。但是,我担心的是,当我将代码集成到tkinter gui中时,可能会遇到意外的挂断。

import pyodbc
import pandas as pd
import time

start = time.time()

db_fpath = 'C:\mydb.accdb'
conn = pyodbc.connect(r'Driver={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={0};'.format(db_fpath))

pd.read_sql_query('SELECT * FROM table',conn)

conn.close()
print(time.time()-start)

我得到以下结果:

15.27361798286438 # with conn.close()
0.4076552391052246 # without conn.close()

如果我将代码包装在一个函数中,但是忽略了对conn.close()的调用,则还会遇到一个挂断,这使我相信,每当我从内存中释放连接时,都会导致速度变慢。

如果我省略了SQL查询(打开连接然后不做任何事就将其关闭),则不会挂断。

  1. 有人可以重复我的问题吗?

  2. 我的连接或关闭方法是否可以更改以避免速度下降?


编辑:经过进一步调查,Dropbox不是问题。我实际上连续3次使用pd.read_sql_query(),使用conn从数据库中导入了3个不同的表。尝试关闭/不关闭连接并读取不同的表(并在测试之间重新启动内核)的不同组合,我确定只有当我读取一个特定的表时,我才会导致连接关闭花费更长的时间。如果不了解ODBC驱动程序的复杂性或该表的不同之处,我不确定是否还能做更多事情。我会上传数据库供其他人尝试,但其中包含敏感信息。我也尝试切换到pypyodbc无效。我认为该表的原始来源实际上是一个较旧的.mdb Access数据库,因此也许从头开始重新构建该表将解决我的问题。

在这一点上,我认为最简单的解决方案是始终将连接对象保留在内存中以避免关闭它。我的初步测试表明,尽管有些痛苦,但可以解决。

0 个答案:

没有答案