我从Node.js的MongoDB集合中返回一批(500k +)文档。它不是用于在网站上显示,而是用于数据处理。如果我抓住所有这些文件,系统就会冻结。有没有更好的方法来抓住这一切?通过Node.js从MongoDB返回大量项目
我在想分页可能工作吗?
编辑:这已经是主要的node.js服务器事件循环外,所以“系统冻结”并没有意味着“传入的请求没有被处理”
我从Node.js的MongoDB集合中返回一批(500k +)文档。它不是用于在网站上显示,而是用于数据处理。如果我抓住所有这些文件,系统就会冻结。有没有更好的方法来抓住这一切?通过Node.js从MongoDB返回大量项目
我在想分页可能工作吗?
编辑:这已经是主要的node.js服务器事件循环外,所以“系统冻结”并没有意味着“传入的请求没有被处理”
学习更多关于您的情况后,我有一些想法:
做尽可能多,你可以在一个Map/Reduce function in Mongo - 也许,如果你扔在节点较少的数据,可能是解决方案。
也许这么多的数据正在吃掉你系统中的所有内存。你的“冻结”可能是V8停止系统做垃圾回收(see this SO question)。你可以使用V8标志--trace-gc来记录GCs &证明这个假设。 (感谢another SO answer about V8 and Garbage collection
分页,就像你的建议可能会有所帮助,甚至可能甚至将你的数据分割成工作队列(创建一个引用记录1-10的工作任务,另一个引用记录11-20,等)取决于你的计算
也许预先处理你的数据 - 即:以某种方式返回小得多数据为每个记录或者不使用ORM为这个特殊的计算,如果你现在使用一个。确保每条记录只有您需要的数据,意味着传输的数据更少,应用程序需要的内存也会减少。
我会把你的大取+过程任务队列,后台进程或分叉机制(这里有很多不同的选项)。
这样你就可以在主要事件循环之外进行计算,并保持自由处理其他请求。虽然你应该在回调中做你的Mongo查找,但计算本身可能需要时间,因此“冻结”节点 - 你不会暂停处理其他请求。
这个进程**在另一个进程中是** ..不是我的主节点循环(网络服务器) – Shamoon
啊,好的:我更新了这个问题。 – RyanWilcox
你为什么需要它? Nodejs不适用于数据处理。你会考虑使用MongoDB map/reduce功能吗? –
不幸的是我们被锁在'Node.js'中 – Shamoon
除非你告诉你正在尝试做什么以及你现在正在做什么,否则这是无法回答的。 – Tomalak