当使用node.js扫描目录树时,因为我们利用具有大目录的异步回调,很容易立即排队超过1000 fs的操作,这通常会导致node.js进程崩溃或仅仅因为使用“EM太多打开文件”错误导致fs操作失败。
有没有人想出解决这个问题的优雅方法?
答案 0 :(得分:1)
多年来的更新:
-
不确定这是否是解决此问题的最佳方法,但我有效完成的是使用包装器包装所有异步fs函数,该包装器检查我们是否打开了超过允许的文件数量(任意设定为合理的100)。如果在通话时打开的文件数量超过那么多,则呼叫将空闲并在延迟后再次检查以查看是否存在打开。可以在此处找到此逻辑的代码:https://github.com/balupton/bal-util/blob/master/src/lib/paths.coffee#L7-45
在实施方面,您只需将require('fs').readFile
或正在使用的任何电话更改为require('bal-util').readFile
并安装bal-util依赖关系(npm install bal-util
),这很简单够了。
希望这会有所帮助。如果有更强大的方法,我很想知道。
答案 1 :(得分:0)
我使用的最干净的模式涉及使用async
模块(https://github.com/caolan/async)和队列。您可以设置队列中的最大并发项数。
var queue = async.queue(do_thing, 500);
queue.drain = function() {
console.log("Done with entries");
};
queue.push(workitem);