메모리 최적화
메모리 최적화 (Memory optimization) (memory)
Redis 공식 문서의 memory 페이지를 한국어로 풀어드릴게요. 옆에서 하나씩 설명해 드리는 느낌으로 읽으시면 돼요.
Redis vector sets(벡터 집합)의 메모리 사용을 어떻게 관리하는지 알려드릴게요. vector sets는 효율적이지만, 벡터 유사도 인덱싱과 그래프 탐색에는 메모리 트레이드오프가 필요해요. 이 가이드는 양자화(quantization), 그래프 튜닝, 속성 선택을 통해 메모리 사용을 관리하는 방법을 알려줘요.
양자화 모드 (Quantization modes)
Vector sets는 세 가지 양자화 수준을 지원해요.
| 모드 | 메모리 사용 | Recall | 비고 |
|---|---|---|---|
Q8 |
4배 작음 | 높음 | 기본값, 빠르고 정확 |
BIN |
32배 작음 | 낮음 | 가장 빠름, 조악한 검색에 최적 |
NOQUANT |
전체 크기 | 가장 높음 | 최고 정밀도, 가장 느림 |
특별히 초정밀(NOQUANT)이나 초고효율(BIN)이 필요하지 않다면 기본값인 Q8을 쓰는 걸 권장해요.
그래프 구조 메모리 (Graph structure memory)
M값을 낮추면 노드당 연결(per-node connections)이 줄어요.- recall을 개선해야 할 필요가 아니라면
M에 불필요하게 큰 값을 쓰지 마세요.
속성과 라벨 크기 (Attribute and label size)
각 노드는 다음을 저장해요.
- 문자열 라벨 (요소 이름)
- 선택적 JSON 속성 문자열
팁:
- 라벨에는 짧고 고정 길이의 문자열을 사용하세요.
- 속성 JSON은 최소화하고 평평하게(flat) 유지하세요. 예를 들어 중첩 데이터 대신
{"year":2020}처럼 쓰는 게 좋아요.
벡터 차원 (Vector dimension)
고차원 벡터는 저장 공간을 늘려요.
- 300 구성 요소 at
FP32= 1200 바이트/벡터 - 300 구성 요소 at
Q8= 300 바이트/벡터
이것은 VADD 중에 REDUCE 옵션을 써서 줄일 수 있는데, random projection을 적용해요.
> VADD setNotReduced VALUES 300 ... element
(integer) 1
> VDIM setNotReduced
(integer) 300
> VADD setReduced REDUCE 100 VALUES 300 ... element
(integer) 1
> VDIM setReduced
(integer) 100
이 예시는 300차원 벡터를 100차원으로 투영해서 크기와 속도는 개선하고 일부 recall은 희생하는 방식이에요. 각 언어별(JavaScript, Java, Go, PHP 등) 예시 코드도 공식 문서에서 확인할 수 있어요.
요약 (Summary)
- 기본적으로
Q8을 사용하고 용도에 따라BIN/NOQUANT로 조정. - 그래프의
M과 라벨·속성 크기를 최소화. - 고차원 벡터는
REDUCE로 차원을 줄여 메모리 절약.
함께 보기 (See also)
- Performance (성능)
- Scalability (확장성)
더 알아보기 (Learn more)
vector sets에 대해 더 배우고 싶다면 아래를 참고하세요.