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

时间:2016-05-06 07:44:26

标签: javascript node.js memory web-worker

我有在节点中启动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是我用BabyParse解析的csv,导致一个具有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]
        });
    }
}

我尝试将数据分块并在工作中以chunkwise方式处理它也可以正常工作。但我想生成一个图形并处理边缘,我需要完整的数据,因为我需要检查每一行(顶点)与其他行。(/ p>

有没有办法将数据流式传输到工作人员?或者是否有人知道为什么节点会分配如此多的内存并发送17MB的数据?

1 个答案:

答案 0 :(得分:1)

您也可以将文件名作为消息传递给worker,让工作人员从磁盘加载它,而不是解析主线程中的数据。否则,您将拥有内存中的所有数据两次,一次在主机中,一次在工作中。

另一种选择是将csv npm包与流解析器一起使用。 postMessage他们进来的线路并缓冲它们直到工人的最终结果。

为什么你的解决方案试图分配那些我不知道的大量内存。我知道postMessage旨在传递小消息。