예시 코드
# DB 연결 객체와 관련 정보는 생략
# 주어진 리스트(result_list)를 일정 크기(chunk_size)의 리스트들로 나누는 함수
def chunks(lst, chunk_size):
for i in range(0, len(lst), chunk_size):
yield lst[i:i + chunk_size]
# result_list가 1000개의 요소를 가지고 있다고 가정
# 각 chunk는 100개의 요소를 가지므로 첫 번째 for문은 10번 반복하게 됩니다
for chunk in chunks(result_list, 100):
record = [] # 매 chunk마다 새롭게 record 리스트를 초기화
for data in chunk:
변수1 = data["데이터1"]
변수2 = data["데이터2"]
변수3 = data["데이터3"]
# record 리스트에 튜플 형태로 데이터를 추가
record.append((변수1, 변수2, 변수3))
query = '''
INSERT INTO 테이블명
(컬럼1, 컬럼2, 컬럼3, ...)
VALUES
(%s, %s, %s, ...)
ON DUPLICATE KEY UPDATE ~ # 생략가능
'''
# executemany() 함수로 한 번에 100개의 데이터 배치 처리
cursor.executemany(query, record)
conn.commit()
위 방식은 대용량 데이터를 효율적으로 데이터베이스에 삽입하는 좋은 방법입니다.
이를 통해 서버에 과부하를 줄이고 성능을 최적화할 수 있습니다.
장점 및 설명
- 효율적인 배치 처리:
- executemany()를 사용하여 한 번에 여러 개의 데이터를 삽입하면 각 데이터를 개별적으로 삽입하는 것보다 훨씬 효율적입니다. 이는 데이터베이스에 대한 연결 및 커밋 횟수를 줄여 성능을 최적화합니다.
- 서버 과부하 감소:
- 대량의 데이터를 한 번에 처리하지 않고 일정 크기의 청크로 나누어 처리함으로써, 데이터베이스 서버에 가해지는 부하를 줄일 수 있습니다. 이는 데이터베이스 서버의 안정성을 높이고, 과부하로 인한 성능 저하를 방지합니다.
- 트랜잭션 관리:
- 각 청크마다 commit()을 호출하여 데이터베이스에 변경 사항을 확정함으로써, 대량의 데이터를 한 번에 커밋할 때 발생할 수 있는 잠재적인 문제를 줄일 수 있습니다. 이는 부분 실패 시 재처리할 데이터를 최소화하는 데 도움이 됩니다.
'Python > 파이썬 문법, 함수, 모듈 등' 카테고리의 다른 글
[Python] SSH 터널링, pymysql 설명과 사용 방법, %s(플레이스홀더) 사용법 sshtunnel, pymysql (0) | 2024.05.29 |
---|---|
[Python] Google Sheets에서 데이터 읽어 오는 방법 gspread (0) | 2024.05.29 |
[Python] 외부 프로세스 실행하는 법 subprocess (0) | 2024.05.28 |
[Python] 2. Multiprocessing(멀티 프로세싱) 결과를 정렬하여 받는 방법, 공유할 데이터가 있을 때의 방법 multiprocessing.Manager() (0) | 2024.05.28 |
[Python] 1. Multiprocessing(멀티 프로세싱) 설명과 사용법 (1) | 2024.05.28 |