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) # 실행
❌ 문제점
- SQL IN 절 제한 초과 가능 → 대부분의 DBMS는 IN 안에 넣을 수 있는 항목 개수에 제한이 있음 (예: 1000~5000개)
- SQL 실행 속도 저하 → 너무 많은 데이터를 한 번에 조회하면 DB 부하가 커짐
- 메모리 부족 → 너무 많은 데이터를 한 번에 가져오면 서버 메모리 사용량이 급증할 수 있음
📌 API에서 list를 한 번에 요청하는 경우 (비효율적인 예시)
import requests
contents = ["DOC001", "DOC002", ..., "DOC500000"] # 50만 개 코드
# 50만 개 문서를 한 번에 API 요청
response = requests.post("https://api.example.com/", json={"codes": contentCodes})
data = response.json()
❌ 문제점
- 서버 부하 증가 → 한 번에 너무 많은 데이터를 요청하면 서버 응답 속도가 느려지고, 심하면 타임아웃 발생
- 네트워크 트래픽 증가 → 너무 많은 데이터를 전송하면 네트워크 병목현상이 발생할 수 있음
- 응답 처리 부담 → 클라이언트가 한꺼번에 너무 많은 데이터를 받아오면 메모리 부족으로 프로그램이 멈출 수도 있음
📌 Pandas에서 대량 데이터를 한 번에 처리하는 경우 (비효율적인 예시)
import pandas as pd
df = pd.read_csv("big_data.csv") # 10GB 이상의 파일을 한 번에 로드
❌ 문제점
- 메모리 초과 오류 → 너무 큰 파일을 한 번에 로드하면 RAM이 부족해서 실행 중단 가능
- 처리 속도 저하 → 한 번에 너무 많은 데이터를 처리하면 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
반응형
'기술공부 > 개발_코드' 카테고리의 다른 글
배치처리 vs. 개별처리 (0) | 2025.02.25 |
---|---|
🚀 Windows에서 OpenSSH를 활용한 원격 접속 설정 및 문제 해결 가이드 (0) | 2025.02.18 |
그래프에서 끊어진 데이터를 이어주는 방법 (0) | 2024.08.13 |
가상환경 구축 후 패키지 깔기 (0) | 2024.08.06 |
엑셀 function: 표에서 원하는 값을 하이라이트하기 (0) | 2024.07.29 |