因此,我有一个相当大的文件目录,我需要在 NodeJS 应用程序中使用长时间运行的进程来不断处理这些文件。该目录正在不断处理和清空,但在任何给定时间排队处理 1000 多个文件并不少见 - 它们是压缩的 CSV 文件,所以我天真的解决方案是获取目录列表,遍历文件,打开每个,解析它们,然后继续,如下所示:
files = fs.readdirSync 'directory'
for filename in files
file_path = path.resolve path.join 'directory', filename
fd = fs.openSync file_path, 'r'
buf = new Buffer fs.statSync(file_path).size
fs.readSync fd, buf, 0, len, 0
fs.closeSync fd
zlib.gunzip buf, (err, buf) =>
throw err if err
content = buf.toString().split("\n")
for line in content
# parse, process content, archive file
我很快就遇到了 EMFILE(打开的文件太多)错误。请原谅 fs 函数和咖啡脚本的同步版本。
有没有更好的方法以托管方式处理大量文件?最终,我想使用像单个解析流这样的东西——我知道如何使用单个大(甚至不断增长的)文件来做到这一点,但不知道如何使用一个充满单独文件的目录。
这些文件由大量不同的客户端生成到面向公众的 Web 服务器,然后通过安全协议定期将它们同步到我的输入目录。不是一个理想的设置,但考虑到系统的特定性质,这是必要的,它解释了为什么我不能简单地将文件更改为单个多路复用流。