2014-11-06 46 views
1

我在节点中做了一些繁重的统计,所以我将分支分派给子进程,其中子进程将处理所有mongo查询并通过数据循环等最后将结果发回给母亲进程。它使用相对较小的数据集很好。Node.js分叉的孩子返回消息限制和解决方法

但是当数据变得足够大时,通信似乎被阻塞或发送回来时出现问题。返回的数据是相当大的HighChart对象,其中包含超过200k的数据点,我可以在子进程调用process.send(data)之前记录消息,并且cpu活动在子进程中几乎降到0,这母亲使用cpu的使用率很高,只是呆在那里而不是下降。在这一点上,这个过程似乎只是挂起(没有挂起,因为它仍然在响应其他请求),但process.on('message',function(){});即使我让它坐在那里跑步也不会触发。

IPC可以为节点处理的大小是否有限制?无论如何围绕这个或者一些破解它?有些人建议使用TCP或其他IP协议而不是IPC,但它有点让管理孩子生活的问题复杂化。

还有什么免费的工具,使调试节点更容易旁边只是使用console.log?

非常感谢您的帮助提前

问候。 G

+0

这很糟糕。除了以前的建议,我无法提供任何帮助,但会对查看您是否找到问题/解决方案感兴趣。 – eshortie 2014-11-06 22:26:27

+0

用不同的方法传递数据,需要的代码更改最少的方法是使用filestream将stringyfy json写入文件,并且一旦完成将文件路径传递回主进程并使其拥有它阅读它然后清理....它很慢,但至少现在正在移动:/ – 2014-11-07 06:09:12

+0

是的,这是一个可行的解决方案,但是IPC是一个问题。 – eshortie 2014-11-07 14:21:38

回答

2

编辑:似乎我错了。请在这里看到Sam的消息:https://stackoverflow.com/a/40178217/1224279

我的原始答案如下。


当的node.js发送过来IPC的对象,相信它被序列化为JSON,发送,然后反序列化。

有邮件大小限制。根据此page,在Linux上默认情况下,单个消息的限制为8KB,消息队列的限制为16KB。你可以通过编辑相应的/proc/sys/kernel文件来改变它。

我不知道如何转化为节点(也许它需要一些缓冲你的关心),但我想有一个在序列化/发送/解串200K的数据点一些严重的开销。

你可能有更好的运气发送他们在较小的位。我发现一个能胜任的系统每秒钟可以解析大约20k-80k的小型Node.js IPC消息。

如果您发送的数据量很大,您必须完成您完成的任务:将数据保存到别处并发送其位置,或使用更适合数据采集的不同传输方式(例如如pipes)。

编辑:参见:How to transfer/stream big data from/to child processes in node.js without using the blocking stdio?

4

伙计们,有几个人正在登陆这个页面上,并认为它是有用的。

process.send()不使用System V IPC,所以上面Penryn链接到System V消息大小的信息是完全不相关的。

处理没有根本的限制。send()消息的大小,而不是内存和cpu的可用性来创建和json编码/解码这样的消息。像往常一样使用node/javascript,JSON.parse()是同步的,所以在非常大的JSON数据缓冲区上调用它会阻塞节点。如果这是一个问题,请在管道中流式传输JSON,并使用其中一个流式JSON解码库 - 整体性能会更差,但整体响应性会更好,因为您不会长时间阻止解析。

如果任何人都可以找到的所谓“邮件大小限制”一reproduceable例如,请github.com/nodejs/node

报告这是一个错误给我们的所有情况我见过的这在用户的应用程序代码中出错。