장소 추천 프로그램 속도 저하 해결 - 100-hours-a-week/12-marong-Wiki GitHub Wiki

📍 DB INSERT 및 Chroma DB .add() 병목 개선

문제 개요

기존에는 **DB와 벡터 DB(Chroma)**에 대해 건별 처리 방식으로 데이터를 삽입했음:

  • SQLAlchemy의 db.add()를 루프 내에서 반복 호출
  • ChromaDBhistory_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)