如何有效地处理Node.js中的大量数据

How to efficiently process a big list of data like that in Node.js?

本文关键字:数据 js 有效地 处理 Node      更新时间:2023-09-26

我在一个文件中有一个相当大的数据列表,我需要在Node.js中处理这些数据。该列表是URL的列表,对每个URL所做的工作本质上是一个请求和对响应所做的一些工作。

由于完成这项工作的代码相当大,所以我只调用启动它的函数doWork()。它接受数据和回调,所以它有点像

function doWork(data, callback)

现在,我目前的做法如下:我用以下方式编码了一个queueManager模块:

var queueManager = {};
queueManager.queue = [];
queueManager.addForProcessing = function (data) {
    this.queue.push(data);
};
queueManager.processing = false;
queueManager.startProcessing = function () {
    if (!this.processing) {
        this.process();
        this.processing = true;
    }
};
queueManager.process = function () {
    var self = this;
    if (this.queue.length > 0) {
        doWork(this.queue.pop(), function () {
            self.process();
        });
    } else {
        this.processing = false;
    }
};
module.exports = queueManager;

我把它和readline一起使用:

rl.on('line', function (data) {
    queueManager.addForProcessing(data);
    queueManager.startProcessing();
});

这是有效的,但似乎并不有效。它实际上是同步代码。一次处理每一行,当处理一行时,不会发生任何事情。问题是,有时,由于每一行都有一个请求,每一行的处理都需要一些时间,这会影响应用程序的效率。事实上,包含数据的文件有超过250K行,所以这很容易成为一个问题。

现在,我为什么要添加这个队列管理器?因为如果我只是:

rl.on('line', function (data) {
    doWork(data, function () {
        console.log(`${data} has been processed...`);
    });
});

该应用程序就是不起作用。它开始大量处理相同的数据,但没有一个处理是正确的。

我的变通方法奏效了,但它会导致效率问题。

因此,在这种情况下,如果我有一个大的数据列表,并且我需要对这些数据进行处理,包括web请求和其他类似操作,我如何才能以比我所做的更有效的方式进行处理?

您应该了解集群和worker-https://nodejs.org/api/cluster.html

Node.js的一个实例在一个线程中运行。服用用户有时想要启动的多核系统的优势Node.js进程的集群来处理负载。

集群模块允许您轻松创建子进程所有共享服务器端口。

您基本上可以将应用程序拆分为两个流程,并将大数据流程发送到后台。然后,您可以使用消息显示主应用程序进程中的队列状态。

这里有一个很好的集群教程-https://www.sitepoint.com/how-to-create-a-node-js-cluster-for-speeding-up-your-apps/