bestsource

Mongodb Aggregation 프레임워크가 맵/축소보다 빠릅니까?

bestsource 2023. 5. 24. 22:17
반응형

Mongodb Aggregation 프레임워크가 맵/축소보다 빠릅니까?

통합 프레임워크는 mongodb 2.2에 도입되었으며 맵/축소에 비해 특별한 성능 향상이 있습니까?

만약 그렇다면, 왜, 어떻게, 얼마입니까?

(이미 제가 직접 테스트를 해봤는데, 성능은 거의 비슷했습니다.

개인적으로 실행한 모든 테스트(자체 데이터 사용 포함)에서는 집계 프레임워크가 맵 축소보다 몇 배 더 빠르며 일반적으로 훨씬 더 빠릅니다.

게시한 데이터의 10분의 1만 가져갑니다. (단, 데이터를 페이징하는 데 걸리는 시간이 아니라 OS 캐시를 삭제하는 대신 캐시를 먼저 워밍업하는 것이 좋습니다.) 저는 다음과 같은 결과를 얻었습니다.

맵리듀스: 1,058ms
집계 프레임워크: 133ms

집계 프레임워크에서 $match를 제거하고 mapReduce에서 {query:}을(를) 제거하고 전체 데이터 세트를 키2로 그룹화했습니다.

맵리듀스: 18,803ms
집계 프레임워크: 1,535ms

그것들은 제가 이전에 했던 실험들과 매우 일치합니다.

벤치마크:

데이터 생성 ==

약 350바이트로 400만 행(파이썬 사용)을 쉽게 생성할 수 있습니다.각 문서에는 다음 키가 있습니다.

  • key1, key2(인덱스 테스트를 위한 두 개의 랜덤 열, 하나는 카디널리티 2000, 하나는 카디널리티 20)
  • 긴 데이터: 각 문서의 크기를 늘리기 위한 긴 문자열
  • 값: 집계를 테스트하기 위한 단순 숫자(const 10)


db = Connection('127.0.0.1').test # mongo connection
random.seed(1)
for _ in range(2):
    key1s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(10)]
    key2s = [hexlify(os.urandom(10)).decode('ascii') for _ in range(1000)]
    baddata = 'some long date ' + '*' * 300
    for i in range(2000):
        data_list = [{
                'key1': random.choice(key1s),
                'key2': random.choice(key2s),
                'baddata': baddata,
                'value': 10,
                } for _ in range(1000)]
        for data in data_list:
            db.testtable.save(data)
Total data size was about 6GB in mongo. (and 2GB in postgres)

테스트 ==

몇 가지 테스트를 했지만 결과를 비교하기에 충분합니다.

참고: 서버가 다시 시작되고, 캐싱 효과를 무시하기 위해 각 쿼리 후 OS 캐시가 정리됩니다.

쿼리: 모든 행을 다음으로 집계key1=somevalue(약 200K 행) 및 합계value각자의key2

  • 지도/지도 10.6초
  • 총 9.7초
  • 그룹 10.3초

쿼리:

지도/도면:

db.testtable.mapReduce(function(){emit(this.key2, this.value);}, function(key, values){var i =0; values.forEach(function(v){i+=v;}); return i; } , {out:{inline: 1}, query: {key1: '663969462d2ec0a5fc34'} })

집계:

db.testtable.aggregate({ $match: {key1: '663969462d2ec0a5fc34'}}, {$group: {_id: '$key2', pop: {$sum: '$value'}} })

그룹:

db.testtable.group({key: {key2:1}, cond: {key1: '663969462d2ec0a5fc34'}, reduce: function(obj,prev) { prev.csum += obj.value; }, initial: { csum: 0 } })

언급URL : https://stackoverflow.com/questions/13908438/is-mongodb-aggregation-framework-faster-than-map-reduce

반응형