perl - 计算包含数十万个文件的目录中文件数量的最快方法

标签 perl unix count directory solaris

在solaris系统中,该系统处理大量文件并将其信息存储在数据库中(是的,我知道使用数据库是获取有关我们拥有的文件数信息的最快方法)。我需要一种快速的方法来监视文件,这些文件随着它们在系统中的前进过程而不断被存储到数据库中。

当前,我使用perl脚本,该脚本将目录读取到数组中,然后获取数组的大小并将其发送到监视脚本。不幸的是,随着我们系统的增长,此监视器的运行速度越来越慢。

我正在寻找一种方法,它可以对所有涉及的目录执行计数操作之后更快地运行,而不是每15-20秒暂停和更新一次。

我相对确定我的瓶颈是数组操作中的读取目录。

我不需要有关文件的任何信息,不需要大小或文件名,只需目录中的文件数。

在我的代码中,我不计算用于保存配置信息的隐藏文件或文本文件。如果保留了此功能,但肯定不是强制性的,那将是很好的。

我发现了一些引用文献,用C代码或类似的东西对inode进行计数,但是我在该领域并不十分有经验。

我想使此监视器尽可能实时。

我使用的perl代码如下所示:

opendir (DIR, $currentDir) or die "Cannot open directory: $!";
@files = grep ! m/^\./ && ! /config_file/, readdir DIR; # skip hidden files and config files
closedir(DIR);
$count = @files;

最佳答案

现在,您所做的只是将整个目录(或多或少)读入内存,只是为了丢弃该内容而将其计数。通过流式传输目录来避免这种情况:

my $count;
opendir(my $dh, $curDir) or die "opendir($curdir): $!";
while (my $de = readdir($dh)) {
  next if $de =~ /^\./ or $de =~ /config_file/;
  $count++;
}
closedir($dh);

重要的是,请勿以任何形式使用glob() glob() will expensively stat() every entry,这不是您想要的开销。

现在,根据操作系统功能或文件系统功能,您可能有更复杂,更轻量的方法(Linux,作为比较,提供了inotify),但是像上面那样流式传输目录与您将可移植得到的一样好。

关于perl - 计算包含数十万个文件的目录中文件数量的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17732799/

相关文章:

C、HTTP 1.1 和 Socket Send 的麻烦

mysql - 我的 table 组织不当的另一个问题

c - Perl 脚本不保存 C 输出文件

perl - 在 Perl 中,在 void 上下文中使用 map 而不是 foreach 循环是否合适?

perl - 我怎么知道 perl 脚本是如何启动的?

linux - 如何从 Linux 上的文件中获取必填字段?

javascript - 如何在 Perl 网络爬虫中处理 Javascript?

c - C题中的多线程编程

java - for循环计算Java中的音节

java - 如何计算 sqlite 数据库中的特定项目?