728x90
반응형
for문을 돌려서 한 개씩 처리하는 방식은 어떨까?
배치 처리와 비교했을 때, for문을 돌려서 한 개씩 처리하는 방식은 **"개별 처리"**라고 볼 수 있습니다.
즉, 배치(batch) 처리 대신 데이터를 하나씩 반복문을 돌면서 처리하는 방식인데, 이는 상황에 따라 비효율적일 수도 있고, 적절할 수도 있습니다.
❌ 한 개씩 처리하는 경우 (비효율적인 방식)
📌 SQL 쿼리를 개별 실행하는 경우
for code in code_list: # 50만 개 문서 코드가 있다고 가정
query = f"SELECT * FROM T_CONTENT_MASTER WHERE CONTENT_CODE = '{code}'"
cursor.execute(query)
result = cursor.fetchall()
process(result)
❌ 문제점
- 쿼리 실행이 너무 많아짐 → 50만 개의 코드를 각각 개별 쿼리로 실행하면, SQL이 50만 번 실행됨 (DB 부하 증가)
- 성능이 매우 느림 → 배치 처리(IN으로 여러 개 한 번에 조회)보다 개별 실행이 훨씬 느림
- 네트워크 부하 증가 → 데이터베이스와의 통신이 지나치게 많아지면서 응답 속도가 느려질 수 있음
✔ 대안: IN 절을 사용하여 한 번에 여러 개를 조회하는 배치 처리를 적용하는 것이 더 나음.
📌 API를 개별 요청하는 경우
import requests
for code in contentCodes: # 50만 개 문서 코드
response = requests.post("https://api.example.com/", json={"code": code})
data = response.json()
process(data)
❌ 문제점
- 서버 요청이 너무 많아짐 → 50만 번의 API 요청을 보내게 되어 서버 부하 발생
- 응답 속도 느려짐 → 네트워크 트래픽 증가로 인해 요청-응답 속도가 심각하게 느려질 수 있음
- 요금 증가 (클라우드 서비스 이용 시) → API 호출 수에 따라 비용이 발생하는 경우 비용이 급증할 가능성이 있음
✔ 대안: 여러 개의 문서 코드를 한 번에 묶어서 요청하는 배치 처리를 적용하면 훨씬 효율적임.
📌 Pandas로 한 개씩 파일 처리하는 경우
import pandas as pd
df = pd.read_csv("big_data.csv")
for _, row in df.iterrows():
process(row) # 하나씩 처리
❌ 문제점
- iterrows()는 매우 비효율적 → Pandas에서 row-by-row 처리는 매우 느림 (벡터 연산을 활용하는 것이 더 빠름)
- 한 번에 처리하는 것이 더 효율적 → DataFrame 연산을 활용하여 한 번에 처리하는 것이 더 빠름
✔ 대안: apply() 함수 또는 벡터 연산을 사용하여 한 번에 처리하거나, **chunk 단위(배치 크기)**로 나누어 처리하는 것이 더 효율적.
✅ 언제 개별 처리가 유리할까?
하지만 개별 처리가 유리한 경우도 있습니다.
1️⃣ 하나의 요청이 매우 무거운 경우
✔ 배치 처리를 하면 한 번에 너무 많은 데이터가 한꺼번에 처리되어 서버가 부담을 느낄 수도 있음
✔ 개별 처리하면 서버가 감당할 수 있는 작은 단위로 처리 가능
예시:
- 대량 파일 업로드 시, 한꺼번에 모든 파일을 전송하면 과부하가 걸릴 수 있음 → 개별 업로드 처리
- 트랜잭션 처리 시, 한 번에 너무 많은 데이터를 변경하면 충돌이 발생할 수 있음 → 개별 트랜잭션 실행
2️⃣ 각 요청이 독립적으로 처리되어야 하는 경우
✔ 배치 처리하면 모든 요청이 하나의 쿼리에 묶이므로, 하나가 실패하면 전체가 실패할 수도 있음
✔ 개별 처리하면 실패한 요청만 다시 실행할 수 있음
예시:
- 은행 이체 시스템: 모든 계좌 이체를 한꺼번에 처리하면 일부 실패 시 전체가 롤백될 수 있음 → 개별 실행
- 이메일 발송 시스템: 배치 처리 중 하나의 이메일 전송이 실패하면 전체가 실패할 수 있음 → 개별 전송
🚀 결론: 언제 배치 처리 vs 개별 처리?
처리 방식 배치 처리 (batch) 개별 처리 (for문으로 하나씩)
데이터 개수 | 많을 때 (수천~수백만 건) | 적을 때 (수십~수백 건) |
데이터베이스 부하 | 적음 (한 번에 여러 개 조회) | 많음 (SQL 실행 횟수 증가) |
API 요청 부하 | 적음 (네트워크 트래픽 감소) | 많음 (반복 요청으로 속도 저하) |
처리 속도 | 빠름 (한 번에 처리) | 느림 (반복 실행) |
개별 실패 시 대응 | 전체 실패 가능 | 실패한 것만 재시도 가능 |
서버 부하 고려 | 서버가 감당 가능할 때 | 서버가 감당하기 어려울 때 |
- 배치 처리는 대량 데이터를 처리할 때 빠르고 효율적
- 개별 처리는 각 요청이 독립적이거나 실패 시 개별 재처리가 필요한 경우
✔ 일반적으로 배치 처리가 더 효율적이지만, 특정 상황에서는 개별 처리가 필요할 수도 있다! 🚀
728x90
반응형
'기술공부 > 개발_코드' 카테고리의 다른 글
배치처리의 장점 (0) | 2025.02.25 |
---|---|
🚀 Windows에서 OpenSSH를 활용한 원격 접속 설정 및 문제 해결 가이드 (0) | 2025.02.18 |
그래프에서 끊어진 데이터를 이어주는 방법 (0) | 2024.08.13 |
가상환경 구축 후 패키지 깔기 (0) | 2024.08.06 |
엑셀 function: 표에서 원하는 값을 하이라이트하기 (0) | 2024.07.29 |