【发布时间】:2016-09-14 02:54:21
【问题描述】:
想象一个包含大量文件的目录。作为一个粗略的衡量标准,我认为到目前为止我们看到的最多的是几百万,但从技术上讲,它可以再高一个数量级。使用节点,我想从这个目录中读取文件,处理它们(基本上是上传它们),然后将它们移出目录。很简单。应用程序运行时会不断添加新文件,而我的工作(就像正在下沉的船上的人拿着水桶一样)是尽快清空这个目录。
那么我有哪些选择? fs.readdir 是 not ideal,它将所有文件名加载到内存中,这在这种规模下成为问题。特别是随着新文件一直在添加,因此需要重复调用。 (顺便说一句,对于将来提到此问题的任何人,有人提议 something 来解决整个问题,这可能会或可能不会在您的时间线内实现。)
我查看了无数的 fs 插件(graceful-fs、chokadir、readdirp 等),但没有一个在其职权范围内有这个特定的用例。
我也遇到过一些人建议这可以用child_process 处理,并且有一个名为inotifywait 的包装器,它的任务本身正是我所要求的,但我真的不明白这是怎么回事解决根本问题,尤其是在这种规模上。
我想知道我是否真正需要做的是找到一种方法来从目录中获取第一个文件(或者实际上是一批文件),而无需将整个目录结构读取到内存中。在读取一定数量的文件后可以终止某种流?我知道 Go 有一个用于从目录中读取前 n 个文件的参数,但我找不到等效的节点,这里有没有人遇到过或有任何有趣的想法?在这一点上,左场解决方案非常受欢迎!
【问题讨论】:
-
说实话,我的直觉是用 C/C++ 编写一些东西来创建某种“readDirStream”。浏览 Linux 文档,readdir(3) 似乎大致符合您的要求。您应该能够使用Node's Addons 与C 调用进行交互。如果您可以围绕 C 调用创建一个流接口,那么您应该可以开始了。
-
当你第一次运行你的脚本时,目录中是否已经有很多文件在等着你?脚本是否期望对文件进行更多处理,而不仅仅是从一个目录复制到另一个目录?文件名是否有命名约定?文件名的某种模式?
-
很有用,所以 unix.stackexchange.com/questions/120077/… 现在,由于我无法使用 C/C++,我将使用 php 和 opendir fn.... :) php.net/opendir
-
@DomVinyard
fs.watch/inotifywait对您的情况有何影响?你试过了吗?似乎正是您想要的情况-添加/删除的每个新文件都会弹出事件,从那里您可以做任何事情。只是想弄清楚在您的“巨大目录”条件下是否存在特定问题。