작은 SELECT는 성공하지만 fetchall·as_pandas로 큰 결과를 모을 때 client 메모리가 증가한다.
클라이언트 결과 누적을 줄이는 절차다. 서버 실행 지연·네트워크 timeout·driver 내부 buffering의 모든 원인을 해결하는 설정은 아니다.
결과를 fetchmany로 읽어 즉시 파일에 기록하고 전체 배치를 메모리에 합치지 않는다.
확인 수준: 추가 조사 해법 · 해당 케이스 적용 결과 미확인
적용 조건: <...>와 예시 DB·테이블·경로·수치는 실제 확인값으로 바꾼다. 명령과 메뉴는 참고 문서를 바탕으로 보강한 예시이며 대상 시스템에서 실행하지 않았다. 버전·원인에 따른 분기와 남은 확인 사항은 아래에 명시한다.
conn을 인수로 받는 함수다. 출력 경로는 새 파일이어야 한다.import csv
from contextlib import closing
def export_rows(conn, sql, output_path):
total = 0
with closing(conn):
with closing(conn.cursor()) as cur:
cur.execute(sql)
with open(output_path, 'x', encoding='utf-8', newline='') as out:
writer = csv.writer(out)
writer.writerow([col[0] for col in cur.description])
while True:
batch = cur.fetchmany(5000)
if not batch:
break
writer.writerows(batch)
total += len(batch)
return total
pandas.concat으로 모두 합치면 메모리가 다시 증가한다. 행이 매우 크면 batch 크기를 줄이고 출력 디스크 공간도 확인한다.작은 범위에서 행 수·값을 대조한 뒤 규모를 늘려 RSS가 지속 증가하지 않는지 확인한다. 전체 export 동안 원본 변경이 있으면 행 수 비교 조건도 고정한다.