2017-02-22 2 views
2

계정 문서가 하나 있습니다. 이 문서는 ~ 1,000 석을 보유하고 있습니다. 각 좌석마다 우리는 의사를 방출합니다. 당연히이 속도가 느릴 것으로 예상됩니다. 지도 기능은 다음과 같이 실행됩니다.Couchdb 슈퍼 슬로우 뷰, 100 % cpu 사용

function(doc) { 
    if (doc.type == 'account') { 
     doc.seats.map(function(seat) { 
      emit(seat.userID, doc)) 
     } 
    } 
} 

그러나 doc.seats를 삭제하면 훨씬 작은 문서를 내보내는 데 도움이되지 않았습니다.

function(doc) { 
    if (doc.type == 'account') { 
     doc.seats.map(function(seat) { 
      delete doc.seats 
      emit(seat.userID, doc)) 
     } 
    } 
} 

왜 좌석을 삭제해도 속도가 향상되지 않는다고 이해하는 사람이 있습니까? 우리가 속도를 낼 수있는 유일한 방법은 doc 객체를 방출하지 않고 id를 내보내는 것입니다.

function(doc) { 
    if (doc.type == 'account') { 
     doc.seats.map(function(seat) { 
      emit(seat.userID, doc.id)) 
     } 
    } 
} 

소파보기 맵에서 문서의 배열을 반복하는 데 문제가 있습니까?

답변

5

tldr; 성능에 대해 걱정하는 경우

  • 문서는 뷰에서 불변

    1. 영구 뷰를 사용합니다. 복사본을 만들지 않고도 추가 할 수 없습니다.
    2. 전체 문서를 자신의 가치로 내보내는 것보다 _id를 사용하고 include_docs를 사용하는 것이 좋습니다. 여기


    설명은 1K 항목으로 자리라는 배열을 포함하여 예제 문서를 사용하여 귀하의 질문에 점 몇 가지 있습니다.

    여기 전체 문서를 보내는 것은 좋지 않습니다. 영구보기 (성능이 전혀 문제가되지 않는다면 항상 사용해야 함) 일 경우 doc 한 권을 가져 와서 1000 개의 사본을 만들고 seat.userID로 색인을 생성했습니다. 이것은 효율적이지 않습니다. 임시보기는보기가 호출 될 때마다 즉석에서 메모리에 생성되므로 더 나쁩니다.

    AFAIK보기를 통해 액세스 할 때 문서가 완전히 변경되지 않으므로 좌석 필드를 삭제하려는 방식이 작동하지 않습니다. 따라서 doc.seats를 삭제해도 루프를 완료하고 원본 문서의 1000 개 사본을 만들므로 성능이 향상되지 않아야합니다. 그러나 시트가 포함되어 있지 않은 문서의 전체 복사본을 만들고이를 통해 전달할 수 있습니다. 예를 들어

    :

    function(doc) { 
        var doc_without_seats = JSON.parse(JSON.stringify(doc)) 
        doc_without_seats['seats'] = null; 
        doc.seats.map(function (seat){ 
        emit(seat.userID, doc_without_seats); 
        }); 
    } 
    

    당신은 문서 대신 doc._id 발광으로 궤도에 확실히입니다. 이 경우 빌드중인 색인은 크기의 1/1000입니다. 그래도 전체 문서에 액세스해야하는 경우 쿼리 할 때 include_docs = true 옵션을보기로 전달할 수 있습니다. 이렇게하면 전체 문서가 색인에 복사되지 않게됩니다.

    또 다른 잠재적 인 최적화는 seat.userID를 사용하여 뭔가를 찾을 때 참조하려는 사항을 방출하는 것입니다. 그래도 크고 다루기 힘들다면 include_docs 메소드를 사용하십시오.

  • +0

    원본 문서는 데이터 측면에서 99 % 좌석 배열입니다. 그래서 내가 그 배열을 뺀 문서를 방출한다면, 그것을 부양해서는 안 될까요? - 사실, 내 코드를 돌아 보면, 내가 생각하기에 삭제가 아마 작동하지 않을 것이다.map() method – Elliot

    +0

    아, 나는 doc이 변하지 않는다고 생각한다. 내 업데이트를 참조하십시오. – sarwar