node.jsでディレクトリツリーをスキャンする場合、大きなディレクトリで非同期コールバックを利用するため、一度に1000 fsを超える操作を即座にキューに入れることが簡単で、node.jsプロセスがクラッシュしたり、単にfs操作が発生したりすることがよくあります。 「EM開いているファイルが多すぎます」エラーで失敗します。
誰かがこれを解決するエレガントな方法を考え出しましたか?
node.jsでディレクトリツリーをスキャンする場合、大きなディレクトリで非同期コールバックを利用するため、一度に1000 fsを超える操作を即座にキューに入れることが簡単で、node.jsプロセスがクラッシュしたり、単にfs操作が発生したりすることがよくあります。 「EM開いているファイルが多すぎます」エラーで失敗します。
誰かがこれを解決するエレガントな方法を考え出しましたか?
何年にもわたる更新:
— </ p>
これがこの問題を解決するための最良の方法であるかどうかはわかりませんが、私が効果的に行ったことは、すべての非同期fs関数を、許可された量を超えるファイルが開いているかどうかをチェックするラッパーでラップされています(任意に妥当な100)。呼び出し時に開いているファイルの数がそれを超える場合、呼び出しはアイドル状態になり、しばらくしてから再度チェックして、開いているファイルがあるかどうかを確認します。このロジックのコードはここにあります:https ://github.com/balupton/bal-util/blob/master/src/lib/paths.coffee#L7-45
実装に関しては、使用している呼び出しを変更するrequire('fs').readFile
か、使用している呼び出しを変更して、十分に単純なbal-util依存関係( )をrequire('bal-util').readFile
インストールする必要があります。npm install bal-util
お役に立てれば。これを行うためのより堅牢な方法があれば、私は知りたいです。
私が使用した中で最もクリーンなパターンはasync
、キューでモジュール(https://github.com/caolan/async)を使用することでした。キュー内の同時アイテムの最大数を設定できます。
var queue = async.queue(do_thing, 500);
queue.drain = function() {
console.log("Done with entries");
};
queue.push(workitem);