ディレクトリ配下にあるファイルを処理する処理が非同期処理でかつ時間とメモリを多く使う場合、何も考えないと、メモリが不足する。
同時に実行する処理の数を制限することで、これを解消する。
最近はあまりいい評判を聞かないが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にこういう処理をさせるのもどうなのかというのもあるが、
やろうと思えば、自前で一からやらずとも、ライブラリを探してくれば
そこそこ簡単にできることがわかった。