pyodbc connection.close () очень медленно работает с базой данных Access - PullRequest
2 голосов
/ 29 марта 2019

Я использую pyodbc, чтобы открыть соединение с файлом базы данных Microsoft Access (.accdb) и выполнить запрос SELECT для создания кадра данных pandas. Я получил драйверы ODBC от здесь . У меня нет проблем с получением и обработкой данных, но закрытие соединения в конце моего кода может занять 10-15 секунд, что раздражает. Пропуск conn.close() устраняет мою проблему, и предыдущие исследования показывают, что закрывать соединение не критично, так как я единственный, кто обращается к файлу. Однако меня беспокоит то, что у меня могут возникнуть неожиданные проблемы в будущем, когда я интегрирую код в мой графический интерфейс tkinter.

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 не было проблемой. На самом деле я использую pd.read_sql_query() 3 раза подряд, используя conn, чтобы импортировать 3 разные таблицы из моей базы данных. Пробуя разные комбинации закрытия / не закрытия соединения и чтения разных таблиц (и перезапуская ядро ​​между тестами), я определил, что только когда я читаю одну конкретную таблицу, я могу заставить закрытие соединения занимать значительно больше времени. Не понимая тонкостей драйвера ODBC или того, что отличается от этой таблицы, я не уверен, что смогу сделать что-нибудь еще. Я хотел бы загрузить свою базу данных для других, чтобы попробовать, но она содержит конфиденциальную информацию. Я также попытался перейти на pypyodbc безрезультатно. Я думаю, что исходный источник таблицы был на самом деле намного старше .mdb Access Database, поэтому, возможно, переделка этой таблицы с нуля решит мою проблему.

На данный момент, я думаю, самое простое решение - просто поддерживать объект подключения в памяти всегда, чтобы не закрывать его. Мое первоначальное тестирование показывает, что это сработает, хотя это немного болезненно.

...