我有在 Node 中启动网络 worker 的典型代码:
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 数据库。 对于小数据,这工作得很好,但是当数据变得稍大时, Node/工作人员就开始陷入困境。
我想要处理的实际数据
是我用 BabyParse 解析的 csv,生成一个具有 149000 个属性的对象,其中每个属性还有另外 17 个属性。 (149000 行 x 17 列 = 2533000 个属性)。文件大小为 17MB。
执行此操作时, Node 将分配大量内存,并最终在 53% 内存分配左右崩溃。机器有4GB。
worker 看起来大致是这样的:
self.onmessage = function (event) {
process(event.data.data);
};
function process(data) {
for (var i = 0; i < data.length; i++) {
self.postMessage({
'properties' : data[i]
});
}
}
我尝试对数据进行分块并在工作线程中对其进行分块处理,这也可以正常工作。但我想生成一个图并处理我需要完整数据的边,因为我需要对照所有其他行检查每一行(顶点)。
有没有办法将数据传输到工作人员中?或者有人知道为什么 Node 分配这么多内存并发送 17MB 数据吗?
最佳答案
您还可以将文件名作为消息传递给工作程序,并让工作程序从磁盘加载它,而不是在主线程中解析数据。否则,所有数据都会在内存中保存两次,一次在主机中,一次在工作线程中。
另一种选择是使用 csv带有流解析器的 npm 包。 postMessage
当行进来时,将它们缓冲起来,直到工作程序中得到最终结果。
我不知道为什么你的解决方案会尝试分配大量内存。我确实知道 postMessage
旨在传递小消息。
关于javascript - 使用 "big"数据在 node.js 中启动 webworker 时内存快速上升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37067013/