当用“大”数据启动node.js中的webworker时,内存快速上升

我有典型的代码在节点中启动webworker:

var Threads = require('webworker-threads'); var worker = new Threads.Worker(__dirname + '/workers/myworker.js'); worker.onmessage = function (event) { // 1. // ... create and execute cypher query ... }; // Start the worker. worker.postMessage({ 'data' : data }); 

在1.我发送一小块处理的数据到一个Neo4J分贝。 对于小data这个工作非常好,但是当数据稍微变大时,工作人员就开始挣扎了。

我想要处理的实际data是一个csv,我用BabyParseparsing得到一个具有149000个属性的对象,每个属性有17个属性。 (149000行×17列= 2533000属性)。 该文件是17MB。

当做这个节点将分配大量的内存,并最终崩溃53%的内存分配。 机器有4GB。

工人看起来大致如下:

 self.onmessage = function (event) { process(event.data.data); }; function process(data) { for (var i = 0; i < data.length; i++) { self.postMessage({ 'properties' : data[i] }); } } 

我尝试将数据分块,然后在工作中对其进行处理,这也是可行的。 但是我想生成一个图并处理需要完整数据的边,因为我需要检查每一行(顶点)与其他所有的数据。

有没有办法将数据stream入工作人员? 还是有没有人有一个想法,为什么节点分配这么多的内存与17MB的数据被发送?

除了parsing主线程中的数据之外,您还可以将文件名作为消息传递给worker,并让worker从磁盘加载。 否则,你将在内存中的所有数据两次,一次在主机,一次在工人。

不同的select是使用csv npm包与streamparsing器。 postMessage当他们进来和缓冲他们,直到工人的最终结果。

为什么你的解决scheme试图分配我不知道的大量内存。 我知道postMessage是为了传递小消息。