-
MongoDB 읽기 성능에 관하여.Software Development/Database 2021. 11. 8. 21:40
몽고디비에 많은 데이터가 들어가 있는 경우에 전체 데이터를 애플리케이션의 메모리에 올리는데 꽤나 많은 시간이 걸린다.
꽤나 많다는 것은 상대적이지만 어쨋든 여러가지를 시도하면서 느낀 점을 적어보려고 한다.
파이썬의 pymongo 라이브러리를 이용해서. 전체 콜렉션에서 모든 도큐먼트를 가져올 수 있다.
대략 300초의 시간이 걸린다고 할 때, 시간을 더 줄이기 위해서 multi-threading을 쓸 수 있다.
그러나 파이썬의 GIL 때문에 multi-threading으로는 모든 도큐먼트를 읽는데 더 빨라지진 않았다.
왜냐하면 DB에서 읽은 데이터를 파이썬 오브젝트로 저장해야 하는데 GIL 때문에 single-thread로 결국 데이터를 저장한다고 보면 된다.
multi-threading이 CPU Bound 성능을 극복하지 못하는 이유 때문이다.
그러면 multi-processing은 어떨까? 결론부터 얘기하면 multi-processing만으로는 읽기 성능이 개선되지 않는다.
왜냐하면 sub-process에서 데이터를 병렬로 읽으면 단일 프로세스보다 빠르다. 그러나 sub-process에서 읽은 데이터를 main-process로 전달해야 하는데, 이때 데이터의 양이 많기 때문에 오히려 시간이 더 걸릴 수 있다.
multiprocessing.Manager를 사용하면 나아질까? 프로세스 간에 객체를 공유할 수 있지만 결국 프로세스간의 통신은 발생한다.
multiprocessing.shared_memory, 즉 공유메모리를 사용하면 나아질 수 있을 것 같지만 테스트 해보지는 않았다.
결국 서브프로세스에서 데이터를 처리하고 전달해야 하는 데이터의 양을 줄여야 속도를 유의미하게 개선할 수 있을 것으로 본다.
Map-Reduce, Spark 등을 분산 처리를 보면 데이터 로컬리티, shuffle에 대해서 들을 수 있는데, 결국 프로세스간 데이터 이동 자체를 최대한 안하는 것이 조금 더 피부로 와닿게 되는 계기였다.
MongoDB의 읽기 성능을 향상 시키기 위해서는 병렬로 읽고, 결국 읽어서 무엇인가 처리하고자 하는 것이 있을텐데 이를 각자 서브프로세스에서 처리하고 메인 프로세스에 모아야 개선이 있을 수 있겠다.
분석을 위한 대량의 데이터를 저장하고 읽는데 있어서 MongoDB가 적절한 Database는 아니다. 컬림지향 DB가 필요한 이유를 찾을 수 있었다.
'Software Development > Database' 카테고리의 다른 글
[데이터 중심 애플리케이션 설계] 일관성과 합의 (0) 2021.12.05 [데이터 중심 애플리케이션] 분산 시스템의 골칫거리 (0) 2021.11.20 [데이터 중심 애플리케이션] 트랜잭션 (0) 2021.11.07 [데이터 중심 애플리케이션] 파티셔닝(분산 데이터) (0) 2021.10.31 [데이터 중심 애플리케이션] 복제(분산 데이터) (0) 2021.10.16