2017-02-11 8 views
2

파이썬 3.5에서 pyodbc와 pandas를 사용하여 MS Access 2010에서 데이터 행을 ~ 10000 행을로드하고 나중에 몇 가지 상관 관계를 계산합니다. 내가 발전기가 무엇을 확인하기 위해 아래의 코드를하려고하면python (pyodbc) : python 결과에서 ms 액세스 쿼리를 실행하여 크기 오류가 발생합니다.

코드는 ~ 10000에서 약 9600 예상 행을 인쇄 한 후 나는 울부 짖는 오류 얻을 : 내가 가지고있는

[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 파일의 크기는 현재 500MB를 넘지 않습니다.

이 오류를 어떻게 극복 할 수 있습니까?

미리 감사드립니다.

+0

'pyodbc.connect'를 호출 한 직후에'con.autocommit = True'를 시도해보십시오 –

+0

고맙습니다. Gord - It worked !! 이 문제가 어떻게 해결되었는지 (내 이해를 위해) 알려주십시오. 다시 한번 고마워요. – pbou

답변

1

pyodbc는 파이썬의 DB-API 스펙에 따라 autocommit=False으로 기본 설정됩니다. 따라서 첫 번째 SQL 문이 실행될 때 ODBC는 Python 코드가 연결시 .commit() 또는 .rollback()이 될 때까지 유효한 데이터베이스 트랜잭션을 시작합니다.

결과 집합의 행을 처리 할 때 Access 데이터베이스 엔진에서 "트랜잭션"에 대한 정보가 점점 더 누적되어 결국 메모리 부족 오류가 발생했습니다. pyodbc 연결을 autocommit=True으로 설정하면 Access 데이터베이스 엔진에 트랜잭션 관련 정보를 추적하지 않아도되므로 오류가 발생하지 않습니다.

+0

thourough 설명에 대해 많은 Gord 감사드립니다. 매우 감사. – pbou