javascript - 使用 "big"数据在 node.js 中启动 webworker 时内存快速上升

标签 javascript node.js memory web-worker

我有在 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/

相关文章:

javascript - 如何在 JupyterLab 中通过 JavaScript 评估文档上下文中的 Python 代码?

javascript - 如何在 Mirage js 中为具有多态一对一关系的模型提供种子?

javascript - node.js 的作业队列

node.js - gulp-exec 中的 file.path 是什么意思

node.js - 从套接字 io 访问 Express session

c - 不太确定,memcpy 上有段错误吗?

javascript - 如何禁用 Google map 移动布局上的滚动?

javascript - 将文字/对象/类传递给具有数千次调用的函数的内存影响

c# - 我如何更改此代码,以便它改为写入字符串?

javascript - 在 WordPress 上寻找用于照片的 Nivo Slider