2011-11-28 61 views
2

我从Node.js的MongoDB集合中返回一批(500k +)文档。它不是用于在网站上显示,而是用于数据处理。如果我抓住所有这些文件,系统就会冻结。有没有更好的方法来抓住这一切?通过Node.js从MongoDB返回大量项目

我在想分页可能工作吗?

编辑:这已经是主要的node.js服务器事件循环外,所以“系统冻结”并没有意味着“传入的请求没有被处理”

+0

你为什么需要它? Nodejs不适用于数据处理。你会考虑使用MongoDB map/reduce功能吗? –

+0

不幸的是我们被锁在'Node.js'中 – Shamoon

+1

除非你告诉你正在尝试做什么以及你现在正在做什么,否则这是无法回答的。 – Tomalak

回答

2

学习更多关于您的情况后,我有一些想法:

  1. 做尽可能多,你可以在一个Map/Reduce function in Mongo - 也许,如果你扔在节点较少的数据,可能是解决方案。

  2. 也许这么多的数据正在吃掉你系统中的所有内存。你的“冻结”可能是V8停止系统做垃圾回收(see this SO question)。你可以使用V8标志--trace-gc来记录GCs &证明这个假设。 (感谢another SO answer about V8 and Garbage collection

  3. 分页,就像你的建议可能会有所帮助,甚至可能甚至将你的数据分割成工作队列(创建一个引用记录1-10的工作任务,另一个引用记录11-20,等)取决于你的计算

  4. 也许预先处理你的数据 - 即:以某种方式返回小得多数据为每个记录或者不使用ORM为这个特殊的计算,如果你现在使用一个。确保每条记录只有您需要的数据,意味着传输的数据更少,应用程序需要的内存也会减少。

2

我会把你的大取+过程任务队列,后台进程或分叉机制(这里有很多不同的选项)。

这样你就可以在主要事件循环之外进行计算,并保持自由处理其他请求。虽然你应该在回调中做你的Mongo查找,但计算本身可能需要时间,因此“冻结”节点 - 你不会暂停处理其他请求。

+0

这个进程**在另一个进程中是** ..不是我的主节点循环(网络服务器) – Shamoon

+0

啊,好的:我更新了这个问题。 – RyanWilcox

1

既然你不需要它们全部在同一时间(这是我从你的分析推断),也许最好将这些500k的东西分成更小的块,在nextTick处理?

你也可以使用类似Kue的东西来排列块并在稍后处理它们(因此不是在同一时间)。