【问题标题】:CouchDB slow List-FunctionCouchDB 慢速列表函数
【发布时间】:2016-07-30 11:38:49
【问题描述】:

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

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

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

正如我所写,对于少量文档,处理时间并不显着,但随着文档数量的增加,列表函数进行处理的时间也会增加。

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

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    有几个技巧可以加速 _list 函数。

    1. 让您的列表和地图函数存在于两个不同的设计文档中,以确保它们在不同的 SpiderMonkey 实例中运行。
    2. 以数十甚至数百千字节的大块发送响应。找出最佳的块大小:太大的块在 TTFB 和内存消耗方面不好,小块会产生 SM 和 Erlang 之间的 IO 开销。
    3. 最小化 Storage->Erlang->JS 序列化/反序列化的开销。使您的 map 函数发出序列化 JSON 的字符串,并从纯字符串解析列表 fn 中每一行的 JSON。传递给 Erlang 的结构越简单,Erlang 端处理它并传递给 SM 的时间就越少。

    你也可以使用缓存的方法,但你必须清楚地了解你在做什么。阅读更多详情here

    【讨论】:

    • 嘿,您发布了一些非常有用的提示!
    【解决方案2】:

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

    【讨论】:

    • 谢谢你的回答。你说出了我的想法。在插入之前进行格式化是不可能的。直接在地图功能中执行此操作也是不可能的。我正在加入地图功能,因此无法访问所需的文档(这是一个正确的假设吗?)。因此唯一的解决方案是将工作转发给客户端或以批处理的方式访问数据。我认为我有多个进程负责不同的请求。
    • @Sceada 我想这是唯一的选择。您可以使用一堆流程来详细说明文档,这些流程最终也可能会生成新文档,您可以使用另一个 map 函数对其进行索引。不幸的是,CouchDB 没有提供任何相当于触发器或存储过程的东西,因此处理复杂情况是应用程序的责任。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2012-07-14
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多