2012-11-02 2 views
7

약 200 명의 사용자로부터 약 20 종류의 문서로 구성된 단일 데이터베이스 (300MB & 42,924 개의 문서)가 있습니다. 문서의 크기는 몇 바이트에서 여러 킬로바이트 (150KB 정도)입니다.CouchDB - 필터링 된 복제 - 속도를 향상시킬 수 있습니까?

서버가 언로드되면 다음 복제 필터 기능을 완료하는 데 약 2.5 분이 걸립니다. 서버가로드되면 10 분 이상 걸립니다.

누구나이 시간이 예상되는지 여부에 대해 의견을 말할 수 있으며, 그렇지 않은 경우 더 좋은 성능을 얻으려면 어떻게해야할까요? 각 가져온 문서가 복잡한 논리를 실행하기위한 복제 여부를 결정하기 때문에

function(doc, req) { 
    acceptedDate = true; 
    if(doc.date) { 
     var docDate = new Date(); 
     var dateKey = doc.date; 
     docDate.setFullYear(dateKey[0], dateKey[1], dateKey[2]); 

     var reqYear = req.query.year; 
     var reqMonth = req.query.month; 
     var reqDay = req.query.day; 
     var reqDate = new Date(); 
     reqDate.setFullYear(reqYear, reqMonth, reqDay); 

     acceptedDate = docDate.getTime() >= reqDate.getTime(); 
    } 

    return doc.user_id && doc.user_id == req.query.userid && doc._id.indexOf("_design") != 0 && acceptedDate; 
} 

답변

9

필터링 복제 속도가 느린 작동합니다

  1. CouchDB를 다음 문서를 가져옵니다;
  2. 필터 기능을 적용해야하므로 문서가 JSON으로 변환됩니다.
  3. JSONify 된 문서가 stdio를 통해 쿼리 서버로 전달됩니다.
  4. 쿼리 서버는 문서를 처리하고 JSON에서 문서를 디코딩합니다.
  5. 이제 쿼리 서버를 조회하고 true 또는 false 값을 CouchDB에 반환하는 필터 함수를 실행합니다.
  6. 결과가 true 인 경우 문서가 복제됩니다.
  7. p.1로 이동하여 모든 문서를 루프합니다.

필터링되지 않은 복제의 경우이 목록을 사용하여 p.2-5를 버리고 p.6은 항상 true 결과를 얻습니다. 이 오버 헤드로 인해 전체 복제 프로세스가 느려집니다.

필터링 된 복제 속도를 크게 개선하려면 Erlang native server을 통해 Erlang 필터를 사용할 수 있습니다. CouchDB 내부에서 실행되며, stdio 인터페이스를 통과하지 않으며 JSON 디코드/인 코드 오버 헤드가 적용되지 않습니다.

참고, Erlang 쿼리 서버는 JavaScript와 같은 샌드 박스 내부에서 실행되지 않으므로, 실행 파일을 실제로 신뢰해야합니다.

또 다른 옵션은 필터 기능을 최적화하는 것입니다. 객체 생성, 메소드 호출을 줄이지 만, 실제로는 이것으로 많은 것을 얻지 못할 것입니다.

관련 문제