【问题标题】:node.js process a big collection of datanode.js 处理大量数据
【发布时间】:2017-09-26 12:54:04
【问题描述】:

我正在节点中使用猫鼬。 我正在请求从远程数据库中检索项目集合。为了得到完整的报告,我需要解析一个很大的集合。

我避免接近以下事物:

model.find({}, function(err, data) {
  // process the bunch of data
})

现在,我使用递归方法,在其中提供局部变量。稍后我会发回有关该过程的信息作为响应。

app.get('/process/it/',(req,res)=>{

  var processed_data=[];

  function resolve(procdata) {
    res.json({status:"ok", items:procdata.length});
  }

  function handler(data, procdata, start, n) { 
    if(data.length <= n)    
      resolve(procdata);
    else {
      // do something with data: push into processed_data
      procdata.push(whatever);

      mongoose.model('model').find({}, function(err, data){     
        handler(data, procdata, start+n, n);    
      }).skip(start).limit(n);
    }
  }

  n=0
  mysize=100

  // first call
  mongoose.model('model').find({}, function(err, data){ 
    handler(data, processed_data, n, mysize);

  }).skip(n).limit(mysize);

})

是否有任何方法或解决方案提供任何性能优势,或者只是以更好的方式实现这一点?

任何帮助将不胜感激。

【问题讨论】:

    标签: node.js mongodb mongoose promise


    【解决方案1】:

    解决方案取决于用例。

    如果处理后的数据不经常更改,您可以拥有一个包含处理后数据的辅助数据库。

    您可以像现在一样使用分页从主数据库加载未处理的数据。并且所有处理过的数据都可以在一个查询中从辅助数据库中加载。

    【讨论】:

      【解决方案2】:

      只要您的数据集不够大就可以,但性能可能会很低。当它达到千兆字节级别时,您的应用程序将简单地中断,因为机器在将数据发送到客户端之前没有足够的内存来存储您的数据。发送千兆字节的报告数据也将花费大量时间。这里有一些建议:

      • 尝试通过 Mongo 聚合框架聚合您的数据,而不是通过您的应用程序代码进行聚合
      • 尝试将报表数据分解为更小的报表
      • 预生成报告数据,将其存储在某处(可能是另一个集合),并在客户需要查看时简单地发送给客户

      【讨论】:

      • 是的,我使用了示例中处理后的数据作为参考。目前处理后的数据不是问题(即使在示例中没有重点关注,也可以在处理后远程存储它)。聚合可以让我受益:)
      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 2013-01-10
      • 2011-01-10
      • 2018-01-21
      • 2012-08-24
      • 2011-09-30
      • 2013-12-24
      相关资源
      最近更新 更多