Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Node.js从MongoDB返回大量项目_Node.js_Mongodb_Bigdata - Fatal编程技术网

通过Node.js从MongoDB返回大量项目

通过Node.js从MongoDB返回大量项目,node.js,mongodb,bigdata,Node.js,Mongodb,Bigdata,我从Node.js中的MongoDB集合中返回了大量(500k+)文档。它不是为了在网站上显示,而是为了数据和一些数字运算。如果我抓取所有这些文件,系统就会冻结。有没有更好的办法抓住这一切 我在想分页可能有用吗 编辑:这已经超出了main node.js服务器事件循环,因此“系统冻结”并不意味着“传入的请求未被处理”我会将您的大型fetch+进程任务放在工作队列、后台进程或分叉机制上(这里有很多不同的选项) 这样,您就可以在主事件循环之外进行计算,并且可以自由地处理其他请求。虽然您应该在回调中执

我从Node.js中的MongoDB集合中返回了大量(500k+)文档。它不是为了在网站上显示,而是为了数据和一些数字运算。如果我抓取所有这些文件,系统就会冻结。有没有更好的办法抓住这一切

我在想分页可能有用吗


编辑:这已经超出了main node.js服务器事件循环,因此“系统冻结”并不意味着“传入的请求未被处理”

我会将您的大型fetch+进程任务放在工作队列、后台进程或分叉机制上(这里有很多不同的选项)


这样,您就可以在主事件循环之外进行计算,并且可以自由地处理其他请求。虽然您应该在回调中执行Mongo查找,但计算本身可能会占用时间,因此“冻结”节点-您不会让它有时间处理其他请求。

因为您不需要同时使用所有请求(这是我从您询问分页时得出的结论),也许最好将这些500k的东西分成更小的块,在同一时间进行处理


您还可以使用类似于队列的方法对数据块进行排队,并在稍后对其进行处理(因此不能同时处理所有数据)。

了解更多有关您的情况后,我有一些想法:

  • 在一个节点中尽可能多地执行—如果您在节点上抛出的数据较少,这可能是解决方案

  • 也许这么多数据正在消耗系统上的所有内存。您的“冻结”可能是停止系统进行垃圾收集。您可以使用V8标志--trace gc来记录GCs&证明这个假设。(感谢

  • 按照您的建议分页可能会有所帮助。甚至可以将数据进一步拆分为工作队列(创建一个参考记录1-10的工作任务,另一个参考记录11-20等)。具体取决于您的计算

  • 可能是预处理您的数据-即:以某种方式为每个记录返回更小的数据。或者如果您现在正在使用ORM,则不使用ORM进行此特定计算。确保每个记录中只包含您需要的数据意味着传输的数据更少,应用程序需要的内存也更少


  • 为什么你需要它?Nodejs不是为了数据压缩。你会考虑使用MangGDB MAP/RADION功能吗?不幸的是,我们被锁定在代码>节点.JS中。除非你告诉你你到底想做什么和你现在在做什么,这是不可能回答的。你有一个代码片段来说明你是如何获取这些文档的吗?s来自mongo?在这种情况下,“冻结”到底是什么意思?是您的节点进程阻塞还是mongo本身?请确保您没有使用.toArray或任何试图在耗尽查询光标时强制节点分配巨大内存块的工具。您可以使用skip()和limit()进行分页但这不应该用于频繁执行的查询,因为它会变得昂贵。更好的分页方法可能是在索引字段中使用$gt和页面最后一条记录的val。我想补充一下mpobrien关于skip/limit的评论。在500k文档中,limit/skip不是一个选项。您应该有一些单调的键您可以使用w/
    $gt
    例如时间戳(确保它已被索引)。即使文档更少,跳过也太慢。此进程在另一个进程中..不是我的主节点循环(web服务器)