2011-09-19 4 views
1

9 백만 행의 쿼리 결과 집합이 있습니다.Python/PyGreSQL을 사용하면 큰 결과 집합을 효율적으로 처리 할 수 ​​있습니까?

나는 각 행에 대해 어떤 처리를 할 필요가, 그리고 코드는 현재이 작업을 수행합니다

query = conn.query(sql) 
results = query.getresult() 

for row in results: 
    # blah 

잘 모르겠어요,하지만 난 getresult() 전체 결과 집합을 잡아 당기는 것을 상상한다. 그럴까요? 필자는 필요에 따라 결과 집합을 청크로 끌어 올 수있는 방법이 있다고 상상하지만, 바로 pg 모듈 문서에서 이와 같은 것을 보지 못했습니다.

대신 pgdb 모듈을 사용하거나 다른 방법을 사용할 수 있습니까?

내 관심사는 응용 프로그램 컴퓨터의 메모리에 대한 것입니다. 도움을 청하면 수백만 개의 행을 한꺼번에 메모리에로드하지 않을 것입니다.

걱정할 가치가 있습니까?

+0

pygresql docs에 따르면 getresult는 연관된 쿼리의 모든 데이터를 보유하는 다양한 목록과 함께 pyquery 개체를 반환합니다. 파이썬의 대체 db 액세스 라이브러리 중 하나에 쿼리 결과를위한 반복자가 포함되어 있는지 확인해야합니다. –

답변

2

에서 만든

cursor = conn.cursor() 
cursor.execute(sql) 

for row in cursor: 
    # do something with row 

, 당신은 커서 사용할 수 반복자입니다 : 다음 curs.fetchone()를 사용

curs = conn.cursor() 
curs.execute('select * from bigtable') 

또는 curs.fetchmany(chunksize)

+0

iter (curs.fetchone())에'for 행을 사용했습니다 :'- 아마도 그것은 특별히 명시 적 이었습니까? 그것은 예상대로 작동합니다. –

+0

@anonymous : ???DB API를 따르는 경우 curs.fetchone()은 첫 번째 행을 가져옵니다. 이상을 반복하면 첫 번째 행의 열 값이 제공됩니다. 아마 당신은'iter (curs.fetchone, None)의 행에 대한 의미 :' –

0

나는 getresult() 동작합니다하지만 또 다른 옵션은 PL/Python 것이 얼마나 확실하지 않다 :

PL/파이썬 절차 언어는 PostgreSQL의 기능은 파이썬 언어로 작성 할 수 있습니다.

이렇게하면 데이터베이스 내부에서 바로 작업 할 수 있습니다. 이것은 당신이해야 할 일에 적합하지 않을 수도 있지만, 한번 살펴볼 가치가 있습니다.

1

pgdb의 커서가 Python Database API spec을 다음 있다면 connpgdb.connect(...)

+0

필자가 이해할 수 있도록 : '반복자'가된다는 것은 전체 결과 집합이 메모리에로드되지 않고 필요에 따라 (각 반복마다) 포스트그레스 서버에서 가져온 것임을 의미합니까? –

+0

@anonymouscoward : 예; 'cursor.next()'는'fetchone()'을 호출하고 결과가 없으면'StopIteration'을 발생시킵니다. 'fetchone()'을 수동으로 호출하는 것보다는 커서를 반복자로 취급하는 것이 더 파이썬적인 일일 것입니다. – geoffspear

0

cursor.fetchmany()를 사용하고 성능과 메모리 사용 사이에 필요한 균형을 제공하는 행 세트를 처리하도록 명시 적으로 arraysize를 설정해야합니다.

DB-API 사양을 사용하는 cx_Oracle로 작성된 작업이 있으며이를 사용하여 20,000 개의 레코드 일괄 처리로 네트워크에서 수십억 개의 행이있는 테이블을 이동합니다. 그것은 시간이 좀 걸리지 만 소스 또는 대상 측에서 서버 메모리를 불고 있지는 않습니다.