如何有效地处理Node.js中的大数据列表?

时间:2016-07-17 22:41:15

标签: javascript node.js performance asynchronous

我在文件中有一个非常大的数据列表,我需要处理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请求等操作的数据,那么我怎么能以比我更有效的方式来做呢? / p>

1 个答案:

答案 0 :(得分:1)

您应该看一下群集和工作人员 - 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/