장소 추천 프로그램 속도 저하 해결 - 100-hours-a-week/12-marong-Wiki GitHub Wiki
.add()
병목 개선
📍 DB INSERT 및 Chroma DB 문제 개요
기존에는 **DB와 벡터 DB(Chroma)**에 대해 건별 처리 방식으로 데이터를 삽입했음:
- SQLAlchemy의
db.add()
를 루프 내에서 반복 호출 ChromaDB
의history_collection.add()
또한 반복 호출됨
이로 인해 발생한 문제:
- DB 트랜잭션 비용 증가: insert 작업마다 트랜잭션 오버헤드가 발생
- 네트워크 및 I/O 병목: Chroma와의 빈번한 통신으로 지연 누적
- 처리 속도 저하: 병렬 처리 효과가 줄고, 전체 추천 속도에 영향을 줌
개선 방향
항목 | 기존 방식 | 개선 방식 |
---|---|---|
SQLAlchemy | db.add(obj) 루프 반복 | db.add_all([...])로 일괄 삽입 |
Chroma DB | collection.add() 여러 번 호출 | ids, documents, metadatas를 한 번에 전달하여 통합 호출 |
트랜잭션 처리 | 루프마다 commit 또는 auto-flush 발생 가능 | add_all() → commit()으로 전체 처리 후 한 번에 커밋 |
적용 방식
SQLAlchemy 예시
# 개선 전
for rec in recommendations:
db.add(rec)
# 개선 후
db.add_all(recommendations)
db.commit()
Chroma DB 예시
# 개선 전
for i in range(len(ids)):
collection.add(ids=[ids[i]], documents=[docs[i]], metadatas=[metas[i]])
# 개선 후
collection.add(ids=ids, documents=docs, metadatas=metas)