2

100万回呼び出したい関数があります。この関数は、データベースに対して 2 つの呼び出しを行います (最初に SELECT、次に UPDATE)。私の現在のアプローチは、これらの関数を配列に格納してから、この配列で async.parallel を呼び出すことです。

ENOMEM か何かになってしまうのではないかと心配しています。

ここでより良いアプローチはありますか?

4

2 に答える 2

4

ジェネレーターを使用してキューを作成できます。

var totalTasks = 1000000;
var nTasks = 0;

// Generate data to send to query 
var getData = (function() {
    var i = 0;

    return function() {
        i++;
        return {
            number: i
        };
    };

})();

// Create the task running each time
var task = function(data, done) {
    nTasks++;
    console.log("Make task", nTasks);
    doQuery(data, done);
};

// Create queue with a limit concurrency
var queue = async.queue(task, 10); // <- parallels queries*

// The callback execute each task was execute
var cb = function(err) {
    if (err) throw err;

    // Add new tasks to queue if is neccesary    
    if (nTasks < totalTasks && queue.length() < queue.concurrency) {
        queue.push(getData(), cb);
    }

};

var i;

// Add the first x tasks to queue
for (i = 0; i < queue.concurrency; i++) {
    queue.push(getData(), cb);
}
  • 接続プールのサイズ、または MySQL の現在の最大プロセス数を考慮する必要があります。
于 2015-10-30T19:18:55.630 に答える
0

各行を処理したい場合は、Mysql streamを使用できるため、各行に必要なものを何でも適用できます(あなたの場合は更新してください);

于 2015-10-30T18:32:02.557 に答える