4

我正在“遍历”十万个 JSON 文件,读取内容并在发生不良情况时抛出错误:

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

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

错误:好的,打开 'path/to/somejsonfile.json'

有机会调查这里发生的事情吗?我确定该walk功能没问题:实际上将调用替换fs.readFile()console.log(filePath)。没有错误。

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

4

2 回答 2

5

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

于 2013-05-07T18:20:32.060 回答
3

“foreach 循环”readFile经常执行。NodeJS 开始在后台线程中打开文件。但是在 foreach 循环完成之前(并且所有文件打开请求都已调度),NodeJS 主线程中不会处理任何文件。由于这个原因,在打开所有文件时不会处理任何文件(然后关闭)。在某个时间点,打开了许多文件并使用了所有可用的句柄,从而导致了无用的错误消息。

他们是您问题的多种解决方案:

首先,您可以一个接一个地同步打开所有文件。但这会减慢应用程序的速度,并且与 NodeJS 的基于事件的编程模型不匹配。(但如果您不介意性能,这是最简单的解决方案)

最好一次只打开特定数量的文件(例如约 1000 个文件),在处理完一个文件后,您可以打开下一个文件。

伪代码:

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.
于 2013-05-07T18:20:16.193 回答