当在Node.js中使用fs.readFile()(在大约十万次迭代之后)时,“Error:OK”?

我“走”了十万个JSON文件,如果发生什么不好的事情,阅读内容并抛出一个错误:

walk(__dirname + '/lastfm_test', 'json', function (err, files) { files.forEach(function (filePath) { fs.readFile(filePath, function (err, data) { if (err) throw err; }); }); }); 

走路function很大程度上受到这个问题的启发(chjj答案)。 经过一些迭代, if (err) throw err被执行。 抛出的错误是:

错误:确定,打开'path / to / somejsonfile.json'

有什么机会去调查这里发生了什么? 我确定walk函数是可以的:实际上用console.log(filePath)replace调用fs.readFile()来显示path。 没有错误。

一些有用的信息:Windows 7 x64,node.exe x64 .0.10.5。 Last.fm数据集从这里下载。

我build议为此使用graceful-fs模块。 它会自动限制打开文件描述符的数量。 它由npm和Node的维护者Isaac Schlueter编写,因此非常稳定。 裸fs模块可以让你在脚下自己射击。

“foreach-loop”经常执行readFile 。 NodeJS开始在后台线程中打开文件。 但是,直到完成foreach循环(并且调度所有文件打开请求)之前,NodeJS主线程中才会处理文件。 由于这个原因,在打开所有文件的时候没有文件被处理(以后closures)。 在某个时间点打开许多文件,并使用所有可用的句柄,导致无用的错误消息。

他们是你的问题的多个soulutions:

首先你可以同时打开所有的文件。 但是这会降低应用程序的速度,并且不能匹配基于事件的NodeJS编程模型。 (但如果你不介意的话,这是最简单的解决scheme)

更好的办法是一次只打开一定数量的文件(例如〜1000个文件),处理完一个文件后,可以打开下一个文件。

Pseude代码:

 1. walk the file system and store all file name in an array 2. fs.readFile for a batch of files from the array 3. In the callback of readFile after processing, start opening more files from the array if not empty.