Я использую 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-запрос (откройте соединение, а затем закройте его, ничего не делая), зависание не произойдет.
Может кто-нибудь продублировать мою проблему?
Могу ли я что-то изменить в своем соединении или методе закрытия, чтобы избежать замедления?
РЕДАКТИРОВАТЬ: После дальнейшего расследования Dropbox не было проблемой. На самом деле я использую pd.read_sql_query()
3 раза подряд, используя conn
, чтобы импортировать 3 разные таблицы из моей базы данных. Пробуя разные комбинации закрытия / не закрытия соединения и чтения разных таблиц (и перезапуская ядро между тестами), я определил, что только когда я читаю одну конкретную таблицу, я могу заставить закрытие соединения занимать значительно больше времени. Не понимая тонкостей драйвера ODBC или того, что отличается от этой таблицы, я не уверен, что смогу сделать что-нибудь еще. Я хотел бы загрузить свою базу данных для других, чтобы попробовать, но она содержит конфиденциальную информацию. Я также попытался перейти на pypyodbc безрезультатно. Я думаю, что исходный источник таблицы был на самом деле намного старше .mdb Access Database, поэтому, возможно, переделка этой таблицы с нуля решит мою проблему.
На данный момент, я думаю, самое простое решение - просто поддерживать объект подключения в памяти всегда, чтобы не закрывать его. Мое первоначальное тестирование показывает, что это сработает, хотя это немного болезненно.