본문 바로가기

Quant

Sorting과 성능 최적화

회사에서 새 프로젝트에 투입되서 이제 슬슬 바빠진다.

신입 때는 1인분 할 수 있을까 걱정했지만, 이제는 새로운 일이라도 딱히 걱정은 안 되고 그냥 하면 될 거 같다.

돌이켜보니 인내심을 갖고 잘 가르쳐주신 이전 선배님들 덕분인 거 같다.

올해도 일복 터진 거 같지만, 인복도 좋기를 빈다. 파이팅


데이터 조회 성능 최적화를 시도하려고 이것저것 알아보고 적용해봤지만,

결론부터 애기하면, 삽질만 하다 끝났다. 그 과정을 정리하고 다음에 까먹지 않으려한다.

 

데이터 조회 시, 시간 순으로 정렬되지 않은 내역을 확인했고 이를 수정하는 과정에서 백테스팅 성능(시간)이 대폭 감소했다.



상황

- 5분봉 데이터(size 77), 일봉 데이터(size 365)는 저장은 1회이고 조회는 여러 번 한다.

 

성능을 위해 아래와 같은 조치를 했다.

- mognoDB timeseries collection 세팅 (기본적으로 timestamp 필드를 기준으로 정렬하지만, 항상 보장하지 않는다)

- 주식 symbol 별로 조회를 하기에 collection을 symbol  명으로 구분함 (ex. A003512)

- 비즈니스 로직에서 sorting 처리함 :(

 

변경점

- DAO에서 sort 옵션을 추가하고, 비즈니스 로직에서 sort 옵션을 제거함

-> 백테스팅 속도 오래걸림.. (어째서?)

 

 

 


성능을 위해 아래와 같은 조치를 했다.

 

1. MognoDB 최적화

- TimeSeries collection 설정 (timestamp 기준으로 정렬됨)

- create_index('timestamp', ASECENDING) 설정 불필요

2. Collection 분리

- 데이터 조회 시, 특정 종목의 1일치 / 1년치 데이터가 필요한 경우이기에 컬렉션을 주식 symbol 단위로 분리했다.

 

3. 데이터 정렬은 1회만

- 개발 과정에서 비즈니스 로직마다 필요 시, sorting 로직을 추가했었음

- DAO에서 정렬된 데이터를 조회하고, 이후에는 sorting 로직 모두 제거

 

 

4. Query 업데이트

- Chaining 기법 적용 find().sort() 은 네트워크를 2번 호출하는 것처럼 보이지만, 실제로는 1회 호출임

- find에 sort 옵션을 넣는 방법도 있지만, 취향 차이라고 한다. (chaining 기법이 가독성에 좋아서 실무에 많이 쓰인다 함)

 

728x90

'Quant' 카테고리의 다른 글

시스템 안정화 (1)  (0) 2025.03.15
Sorting과 성능 최적화 (2)  (0) 2025.03.13
돈 파쇄기 개발 성공  (0) 2025.03.07
대체거래소 첫날과 매매 시간 최적화  (0) 2025.03.05
프론트엔드와 삽질  (0) 2025.03.03