9

在处理大量文件并将其信息存储在数据库中的 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;
4

2 回答 2

10

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

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()都会很昂贵stat(),这不是您想要的开销。

现在,您可能有更复杂和更轻量级的方法来执行此操作,具体取决于操作系统功能或文件系统功能(相比之下,Linux 提供了 inotify),但是像上面那样流式传输 dir 与您将便携式获得的一样好.

于 2013-07-18T20:35:05.670 回答
-1

保持简短。

@files = readdir(DIR) - 2;

The -2 is because readdir counts "." and ".." as directory entries.

print @files . " files found\n";
exit;

找到 1 个文件

于 2014-10-27T15:00:40.730 回答