加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:48:33 所属栏目:大数据 来源:网络整理
导读:在solaris系统中处理大量文件并将其信息存储在数据库中(是的,我知道使用数据库是获取有关我们文件数量的信息的最快方法).我需要快速的方法来监视文件,因为它们在通过系统进行存储在数据库中的过程中. 目前,我使用perl脚本将目录读入数组,然后获取数组的大小
在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),您可能会有更复杂,更轻量级的方法,但是如上所述流式传输方式与您可以轻松获得的一样好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读