7
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

Node.jsでディレクトリーを指定して大量に処理するには

ディレクトリ配下にあるファイルを処理する処理が非同期処理でかつ時間とメモリを多く使う場合、何も考えないと、メモリが不足する。

同時に実行する処理の数を制限することで、これを解消する。

最近はあまりいい評判を聞かないがasync.jsを使うと以下の様に簡単に書くことが出来る。

var async = require('async');

var q = async.queue(function(path, callback) {
    hoge(path, callback);
}, 10 // 同時実行数);

q.drain = function() {
    console.log('all items have been processed but writting files maybe..');
}

function hoge(path,callback) {
    console.log("hoge start",path);
    // 本来は時間が掛る処理
    // コールバックを呼ぶのが重要。
    // これが無いとasyncライブラリが、処理の終了を検出できない模様。  
    setTimeout(callback,2000);
}

function
dirWalk(dir) {
    fs.readdir(dir, function(err, files) {
        for (var i = 0; i < files.length; i++) {
            //ファイルがディレクトリだったら再帰処理
            if (fs.statSync(dir + "/" + files[i]).isDirectory()) {
                dirWalk(dir + "/" + files[i]);
            } else {
                // 通常ファイルの場合、キューに登録
                q.push(dir + "/" + files[i], function(err) {});
            }
        }
    });
}

まとめ

そもそも、Node.jsにこういう処理をさせるのもどうなのかというのもあるが、
やろうと思えば、自前で一からやらずとも、ライブラリを探してくれば
そこそこ簡単にできることがわかった。

関連投稿

関連記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
7
Help us understand the problem. What are the problem?