1

使用 node.js 扫描目录树时,由于我们对大目录使用异步回调,因此很容易立即将超过 1000 个 fs 操作立即排队,这通常会导致 node.js 进程崩溃或仅用于 fs 操作因“EM 打开的文件过多”错误而失败。

有没有人想出一个优雅的方法来解决这个问题?

4

2 回答 2

2

历年更新:

  1. 我根据这个答案编写了一个https://npmjs.com/package/safefs包
  2. Isaac 编写了一个https://npmjs.com/package/graceful-fs
  3. Safefs 现在使用 graceful-fs 包
  4. 进程也存在同样的问题,所以我创建了https://npmjs.com/package/safeps包,它解决了许多其他问题

——</p>

不确定这是否是解决此问题的最佳方法,但我有效地做的是用一个包装器包装所有异步 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

希望这可以帮助。如果有更强大的方法可以做到这一点,我很想知道。

于 2012-08-19T02:53:32.437 回答
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);
于 2012-08-20T13:41:05.610 回答