几天来,我一直在寻找一个有效的错误解决方案

错误:EMFILE,打开的文件太多

似乎很多人都有同样的问题。通常的答案是增加文件描述符的数量。所以,我试过了:

sysctl -w kern.maxfiles=20480

缺省值为10240。在我看来,这有点奇怪,因为我在目录中处理的文件数量低于10240。更奇怪的是,在增加了文件描述符的数量之后,我仍然收到相同的错误。

第二个问题:

经过多次搜索,我找到了一个解决“打开文件太多”问题的方法:

var requestBatches = {};
function batchingReadFile(filename, callback) {
  // First check to see if there is already a batch
  if (requestBatches.hasOwnProperty(filename)) {
    requestBatches[filename].push(callback);
    return;
  }

  // Otherwise start a new one and make a real request
  var batch = requestBatches[filename] = [callback];
  FS.readFile(filename, onRealRead);
  
  // Flush out the batch on complete
  function onRealRead() {
    delete requestBatches[filename];
    for (var i = 0, l = batch.length; i < l; i++) {
      batch[i].apply(null, arguments);
    }
  }
}

function printFile(file){
    console.log(file);
}

dir = "/Users/xaver/Downloads/xaver/xxx/xxx/"

var files = fs.readdirSync(dir);

for (i in files){
    filename = dir + files[i];
    console.log(filename);
    batchingReadFile(filename, printFile);

不幸的是,我仍然收到相同的错误。 这段代码有什么问题?


当前回答

使用Isaac Schlueter (node.js维护者)的graceful-fs模块可能是最合适的解决方案。如果遇到EMFILE,它会执行增量回退。它可以用作内置fs模块的临时替代品。

其他回答

首先使用expo update更新你的expo版本,然后运行yarn / NPM install。这为我解决了问题!

使用Isaac Schlueter (node.js维护者)的graceful-fs模块可能是最合适的解决方案。如果遇到EMFILE,它会执行增量回退。它可以用作内置fs模块的临时替代品。

我不确定这是否对任何人都有帮助,我开始做一个有很多依赖关系的大项目,这让我犯了同样的错误。我的同事建议我使用brew安装watchman,这为我解决了这个问题。

brew update
brew install watchman

2019年6月26日编辑: Github链接到watchman

使用最新的fs-extra。

我在Ubuntu(16和18)上遇到了这个问题,有足够的文件/套接字描述符空间(用lsof |wc -l计数)。使用fs-extra 8.1.0版本。更新到9.0.0后,“错误:EMFILE,太多打开的文件”消失了。

我在不同操作系统的节点处理文件系统上遇到过不同的问题。文件系统显然不是简单的。

这可能会解决你的问题,如果你正在努力部署一个用Visual Studio模板创建的React解决方案(并有一个web.config)。在Azure发布管道中,选择模板时,使用:

Azure应用程序服务部署

而不是:

将Node.js应用部署到Azure应用服务

这对我很管用!