CouchDB慢List-Function

时间:2016-07-21 14:27:25

标签: couchdb

总的来说,我知道问题是什么,但我不知道如何解决它。

我有一个简单的地图功能:

function(doc) {
   if(doc.Type === 'Mission'){
      for(var i in doc.Sections){
         emit(doc._id, {_id:doc.Sections[i].id});
      }
   }
}

根据map-function的结果,我使用list-function进行一些格式化:

function(head,req){

   var result=[];
   var row;

   topo = require('lib/topojson');

   while(row=getRow()){
      if (row !== null) {
         if(row.value._id){
            row.doc.Geometry.properties.IDs.Section_ID = row.value._id;
         }else{
            row.doc.Geometry.properties.IDs.Section_ID = row.value;
         }

         geojson = {
            type: "Feature",
            geometry: row.doc.Geometry.geometry,
            properties: row.doc.Geometry.properties
         };

         result.push(geojson);
      }else{
         send(JSON.stringify({
            status_code: 404
         }));
      }

   }
   send(JSON.stringify(result));
}

与map-function匹配的文档越多,使用list-function进行处理所需的时间就越长。限制因素是couchjs视图服务器。首先,必须序列化map-function的结果,然后list-function才能完成工作。

正如我所写,对于少量文档,处理时间并不严重,但随着文档数量的增加,列表功能处理的时间也会增加。

是否有人想改进格式化结果的方法? 让客户做好工作会更好吗?

2 个答案:

答案 0 :(得分:0)

列表函数在运行时执行,这意味着处理时间与视图返回的文档数成比例。您可以使用列表功能显示博客的最后20个帖子,但不能用它来详细说明100.000个文档。这是必须在地图功能中完成的事情。在你的位置我会修改map函数来执行你在list函数中执行的操作,或者更好的是,我会在保存文档之前执行它们。

答案 1 :(得分:0)

加速_list函数存在一些技巧。

  1. 使您的列表和地图功能在两个不同的设计文档中生效,以确保它们在不同的SpiderMonkey实例中运行。
  2. 以大块,数十甚至数百千字节发送响应。找出最佳的块大小:太大的块在TTFB和内存消耗方面都很糟糕,小块会在SM和Erlang之间产生IO开销。
  3. 最小化Storage-> Erlang-> JS序列化/反序列化的开销。使map函数发出序列化JSON的字符串,并从列表fn解析列表fn中的每一行的JSON。传递给Erlang的结构越简单,Erlang方面处理它并传递给SM的时间就越少。
  4. 您也可以使用缓存方法,但您必须清楚地了解自己在做什么。阅读更多详情here