LoginSignup
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-09

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

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

最近はあまりいい評判を聞かないが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にこういう処理をさせるのもどうなのかというのもあるが、
やろうと思えば、自前で一からやらずとも、ライブラリを探してくれば
そこそこ簡単にできることがわかった。

関連投稿

関連記事

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7