我有在节点中启动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的数据?
答案 0 :(得分:1)
您也可以将文件名作为消息传递给worker,让工作人员从磁盘加载它,而不是解析主线程中的数据。否则,您将拥有内存中的所有数据两次,一次在主机中,一次在工作中。
另一种选择是将csv npm包与流解析器一起使用。 postMessage
他们进来的线路并缓冲它们直到工人的最终结果。
为什么你的解决方案试图分配那些我不知道的大量内存。我知道postMessage
旨在传递小消息。