所以,我有一个相当大的文件目录,我需要在NodeJS应用程序中使用一个长时间运行的进程来不断处理这些文件。该目录正在不断地被处理和清空,但在任何给定时间排队处理1000多个文件并不罕见-它们是gzip压缩的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函数的Sync版本和coffeescript。
有没有更好的方法来管理大量的文件?最终,我想使用类似于单个解析流的东西-我知道如何处理单个大文件(甚至是不断增长的文件),但不知道如何处理充满单独文件的目录。
这些文件是由大量不同的客户端生成到一个面向公众的Web服务器上的,然后该服务器通过一个安全协议定期将它们同步到我的输入目录。这不是一个理想的设置,但考虑到系统的特定性质,这是必要的,这也解释了为什么我不能简单地将文件更改为单一的多路复用流。
2条答案
按热度按时间cbeh67ev1#
不完全是解析流,但可能是朝着它迈出的一步:
你可以使用https://npmjs.org/package/generic-pool来限制并发处理的文件数量。你只需要定义什么资源要被池化。
在您的例子中,我假设要共享的资源应该是一个文件处理器,这样一次只能有一个或几个文件处理器。
您还可以使用某种迭代器方法来简化接下来要处理的文件。
编辑:完成我的答案。我有一个去你的问题,并尝试了这个https://gist.github.com/Floby/5064222
kr98yfug2#
Mixu的《Node》一书中有一节专门介绍了如何管理这类问题。http://book.mixu.net/node/ch7.html
您可以使用以下代码以“有限并行”方式运行代码,如图所示-并且可以使用limit参数轻松管理您希望一次加载的数量:
字符串