2017-02-22 10 views
2

アカウントdocが1つあります。この文書は〜1k席あります。各座席について、私たちは文書を発行する。当然、これは遅いと期待しています。 map関数は次のように実行します: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のコピーを1つ作成してから1000個のコピーを作成し、seat.userIDでインデックスを作成しました。これは効率的ではありません。それは一時的なビューとして悪いです。なぜなら、ビューが呼び出されるたびにメモリ上でオンザフライで生成されるからです。

    AFAIK docは、ビューでアクセスすると完全に変更できないため、シートのフィールドを削除しようとすると機能しません。したがって、ループを完了して元のdocの1000個のコピーを作成するつもりであるため、doc.seatsを削除するとパフォーマンスは向上しません。ただし、シートが含まれていないdocのディープコピーを作成し、emitを通すことができます。例えば

    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オプションをビューに渡すことができます。これにより、全体の文書が索引にコピーされなくなります。

    もう1つの潜在的な最適化は、seat.userIDで何かを見たときに参照したいことを放つだけです。それでも大規模で扱いにくい場合は、include_docsメソッドを使用してください。

  • +0

    元のdocは、データに関して99%の座席配列です。だから、もし私がその配列からマイナスの配列を出したら、それはブーストを与えるべきではないのですか? - 実際、私のコードを振り返ってみると、おそらく私が期待していたように、削除はおそらく動作しません。map()メソッド – Elliot

    +0

    ああ、私はdocが不変だと信じています。私の更新を参照してください。 – sarwar

    関連する問題