본문 바로가기
Python/파이썬 문법, 함수, 모듈 등

[Python] 효율적인 대용량 데이터 삽입 방법

by dong_su 2024. 5. 30.

예시 코드

#  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()을 호출하여 데이터베이스에 변경 사항을 확정함으로써, 대량의 데이터를 한 번에 커밋할 때 발생할 수 있는 잠재적인 문제를 줄일 수 있습니다. 이는 부분 실패 시 재처리할 데이터를 최소화하는 데 도움이 됩니다.