gpt4 book ai didi

node.js - 如何使用 Node.js 处理大型(1000+ 个文件)目录中的文件?

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:17 24 4
gpt4 key购买 nike

因此,我有一个相当大的文件目录,我需要在 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 函数和 CoffeeScript 的同步版本。

是否有更好的方法以托管方式处理大量文件?最终,我想使用诸如单个解析流之类的东西 - 我知道如何使用单个大(甚至不断增长的)文件来做到这一点,但不知道如何使用充满单独文件的目录。

这些文件由大量不同的客户端生成到面向公众的 Web 服务器,然后服务器通过安全协议(protocol)定期将它们同步到我的输入目录。这不是一个理想的设置,但考虑到系统的具体性质是必要的,它解释了为什么我不能简单地将文件更改为单个多路复用流。

最佳答案

不完全是一个解析流,但可能是朝着它迈出的一步:

您可以使用https://npmjs.org/package/generic-pool限制正在处理的并发文件的数量。您只需定义要池化的资源即可。

在你的例子中,我假设要池化的资源应该是一个文件处理器,这样只有一个或几个可以同时存在。

您还可以使用某种迭代器方法来简化接下来要处理的文件。

编辑:完成我的回答。我尝试了你的问题并尝试了这个 https://gist.github.com/Floby/5064222

关于node.js - 如何使用 Node.js 处理大型(1000+ 个文件)目录中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com