기술공부/개발_코드

배치처리의 장점

넹넹선생님 2025. 2. 25. 13:51
728x90
반응형

list(목록)를 한 번에 넣는 경우, 즉, 모든 데이터를 한 번에 처리하는 방식이 문제를 일으킬 수 있기 때문에 배치 처리가 필요합니다.


❌ 리스트(list)를 한 번에 넣는 경우 (비효율적인 방식)

예를 들어, 대량의 데이터를 한꺼번에 SQL 쿼리에 넣거나 API 요청에 사용하면 부하가 발생합니다.

📌 SQL에서 list를 한 번에 넣는 경우 (비효율적인 예시)

contentCodes = ["DOC001", "DOC002", ..., "DOC500000"]  # 50만 개 문서 코드

# 50만 개를 한 번에 넣는 경우
placeholders = ','.join(["'{}'".format(code) for code in contentCodes])
query = f"SELECT * FROM T_CONTENT_MASTER WHERE CONTENT_CODE IN ({placeholders})"

cursor.execute(query)  # 실행

❌ 문제점

  1. SQL IN 절 제한 초과 가능 → 대부분의 DBMS는 IN 안에 넣을 수 있는 항목 개수에 제한이 있음 (예: 1000~5000개)
  2. SQL 실행 속도 저하 → 너무 많은 데이터를 한 번에 조회하면 DB 부하가 커짐
  3. 메모리 부족 → 너무 많은 데이터를 한 번에 가져오면 서버 메모리 사용량이 급증할 수 있음

📌 API에서 list를 한 번에 요청하는 경우 (비효율적인 예시)

import requests

contents = ["DOC001", "DOC002", ..., "DOC500000"]  # 50만 개 코드

# 50만 개 문서를 한 번에 API 요청
response = requests.post("https://api.example.com/", json={"codes": contentCodes})
data = response.json()

❌ 문제점

  1. 서버 부하 증가 → 한 번에 너무 많은 데이터를 요청하면 서버 응답 속도가 느려지고, 심하면 타임아웃 발생
  2. 네트워크 트래픽 증가 → 너무 많은 데이터를 전송하면 네트워크 병목현상이 발생할 수 있음
  3. 응답 처리 부담 → 클라이언트가 한꺼번에 너무 많은 데이터를 받아오면 메모리 부족으로 프로그램이 멈출 수도 있음

📌 Pandas에서 대량 데이터를 한 번에 처리하는 경우 (비효율적인 예시)

import pandas as pd

df = pd.read_csv("big_data.csv")  # 10GB 이상의 파일을 한 번에 로드

❌ 문제점

  1. 메모리 초과 오류 → 너무 큰 파일을 한 번에 로드하면 RAM이 부족해서 실행 중단 가능
  2. 처리 속도 저하 → 한 번에 너무 많은 데이터를 처리하면 CPU 사용률이 급증하여 프로그램이 느려짐

✅ 배치(Batch) 처리 적용 (효율적인 방식)

위 문제를 해결하기 위해 리스트 데이터를 일정 크기(batch_size)로 나누어 처리합니다.

📌 SQL 쿼리에 배치 처리 적용 (효율적인 예시)

def getQueryForMultipleCodesInBatches(contentCodes, batch_size=1000):
    queries = []
    for i in range(0, len(contentCodes), batch_size):  # 1000개씩 슬라이싱
        batch_codes = contentCodes[i:i+batch_size]
        placeholders = ','.join(["'{}'".format(code) for code in batch_codes])
        query = f"SELECT * FROM T_CONTENT_MASTER WHERE CONTENT_CODE IN ({placeholders})"
        queries.append(query)
    return queries

# 실행
queries = getQueryForMultipleCodesInBatches(contentCodes, batch_size=1000)
for query in queries:
    cursor.execute(query)  # 1000개씩 실행

✅ 해결

✔ IN 절에 1000개씩 넣어서 SQL 제한 초과 방지
✔ 한 번에 많은 데이터를 가져오지 않으므로 메모리 과부하 방지
✔ 여러 번 실행하여도 DB 성능을 최적화할 수 있음


📌 API 요청에 배치 처리 적용 (효율적인 예시)

import requests

def getContentsInBatches(contentCodes, batch_size=1000):
    results = []
    for i in range(0, len(contentCodes), batch_size):
        batch_codes = contents[i:i+batch_size]  # 1000개씩 나누기
        response = requests.post("https://api.example.com/", json={"codes": batch_codes})
        results.extend(response.json())  # 결과 합치기
    return results

# 실행
data = getContentsInBatches(contents, batch_size=1000)

✅ 해결

✔ 한 번에 너무 많은 데이터를 요청하지 않으므로 서버 부하 감소
✔ 네트워크 트래픽을 최적화하여 응답 속도 개선
✔ 클라이언트 메모리 과부하를 줄여 프로그램 안정성 향상


📌 Pandas에서 배치 처리 적용 (효율적인 예시)

import pandas as pd

# 데이터가 클 경우, chunksize를 사용하여 나누어 읽기
chunksize = 100000  # 10만 행씩 처리
for chunk in pd.read_csv("big_data.csv", chunksize=chunksize):
    process(chunk)  # 데이터 가공

✅ 해결

✔ 10GB 이상의 대량 데이터를 한 번에 읽지 않고 작은 조각으로 나누어 로드
✔ 메모리 부족 문제를 방지하여 안정적인 데이터 처리 가능


🚀 결론

배치 처리를 하지 않고 list를 한 번에 넣는 경우
→ SQL 실행 오류, 서버 부하, 네트워크 과부하, 메모리 초과 등의 문제가 발생할 수 있음

배치 처리를 사용하여 일정 크기로 나누어 실행하면
→ 시스템 안정성을 유지하면서 성능 최적화 가능 🚀

따라서, 대량의 데이터를 다룰 때는 항상 배치 처리를 고려하는 것이 중요합니다! 💡

728x90
반응형