通过Node.js从MongoDB返回大量项目
我从Node.js中的MongoDB集合中返回了大量(500k+)文档。它不是为了在网站上显示,而是为了数据和一些数字运算。如果我抓取所有这些文件,系统就会冻结。有没有更好的办法抓住这一切 我在想分页可能有用吗通过Node.js从MongoDB返回大量项目,node.js,mongodb,bigdata,Node.js,Mongodb,Bigdata,我从Node.js中的MongoDB集合中返回了大量(500k+)文档。它不是为了在网站上显示,而是为了数据和一些数字运算。如果我抓取所有这些文件,系统就会冻结。有没有更好的办法抓住这一切 我在想分页可能有用吗 编辑:这已经超出了main node.js服务器事件循环,因此“系统冻结”并不意味着“传入的请求未被处理”我会将您的大型fetch+进程任务放在工作队列、后台进程或分叉机制上(这里有很多不同的选项) 这样,您就可以在主事件循环之外进行计算,并且可以自由地处理其他请求。虽然您应该在回调中执
编辑:这已经超出了main node.js服务器事件循环,因此“系统冻结”并不意味着“传入的请求未被处理”我会将您的大型fetch+进程任务放在工作队列、后台进程或分叉机制上(这里有很多不同的选项)
这样,您就可以在主事件循环之外进行计算,并且可以自由地处理其他请求。虽然您应该在回调中执行Mongo查找,但计算本身可能会占用时间,因此“冻结”节点-您不会让它有时间处理其他请求。因为您不需要同时使用所有请求(这是我从您询问分页时得出的结论),也许最好将这些500k的东西分成更小的块,在同一时间进行处理
您还可以使用类似于队列的方法对数据块进行排队,并在稍后对其进行处理(因此不能同时处理所有数据)。了解更多有关您的情况后,我有一些想法:
为什么你需要它?Nodejs不是为了数据压缩。你会考虑使用MangGDB MAP/RADION功能吗?不幸的是,我们被锁定在代码>节点.JS中。除非你告诉你你到底想做什么和你现在在做什么,这是不可能回答的。你有一个代码片段来说明你是如何获取这些文档的吗?s来自mongo?在这种情况下,“冻结”到底是什么意思?是您的节点进程阻塞还是mongo本身?请确保您没有使用.toArray或任何试图在耗尽查询光标时强制节点分配巨大内存块的工具。您可以使用skip()和limit()进行分页但这不应该用于频繁执行的查询,因为它会变得昂贵。更好的分页方法可能是在索引字段中使用$gt和页面最后一条记录的val。我想补充一下mpobrien关于skip/limit的评论。在500k文档中,limit/skip不是一个选项。您应该有一些单调的键您可以使用w/
$gt
例如时间戳(确保它已被索引)。即使文档更少,跳过也太慢。此进程在另一个进程中..不是我的主节点循环(web服务器)