2017-02-11 1 views
2

Я использую pyodbc и pandas на python 3.5 для загрузки ~ 10000 строк данных из MS Access 2010 в фрейм данных и вычисления некоторых корреляций впоследствии.python (pyodbc): Запустить мс запрос доступа из результатов python к ошибке размера

Когда я пытаюсь код ниже, чтобы увидеть, что делает генератор, код печати около 9600 ожидаемых строк из из ~ 10000, а затем я получаю сильфона ошибку:

[Microsoft][ODBC Microsoft Access Driver] The query cannot be completed. Either the size of the query is larger than the maximum size of a database (2 GB), or there is not enough temporary storage space on the disk to store the query result.

**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 не более 500 Мб на данный момент.

Не могли бы вы дать мне знать, как я могу преодолеть эту ошибку?

Большое спасибо заранее.

+0

Возможно, попробуйте 'con.autocommit = True' сразу после вашего звонка на' pyodbc.connect' –

+0

Спасибо большое Горд - он сработал! Хотели бы вы сообщить мне (для моего понимания), как это исправить мою проблему? Еще раз большое спасибо. – pbou

ответ

1

При установлении соединения pyodbc по умолчанию имеет значение autocommit=False в соответствии с спецификацией DB-API Python. Поэтому, когда выполняется первый оператор SQL, ODBC начинает транзакцию базы данных, которая остается в силе до тех пор, пока код Python не сделает .commit() или .rollback() в соединении.

Очевидно, по мере того, как вы обрабатывали строки в вашем результирующем наборе, механизм базы данных доступа собирал все больше и больше информации о «транзакции», что в конечном итоге вызывало ошибку вне памяти. Установка соединения pyobbc на autocommit=True показала, что механизм доступа к базам данных не беспокоится о отслеживании любой связанной с транзакцией информации, что позволяет избежать ошибки.

+0

Большое спасибо Горду за объяснение. Очень признателен. – pbou

Смежные вопросы