【问题标题】:quickest way to count the number of files in a directory containing hundreds of thousands of files计算包含数十万个文件的目录中文件数量的最快方法
【发布时间】:2013-07-17 22:54:43
【问题描述】:

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

【问题讨论】:

  • 使用 perl 线程或分叉来减少等待时间
  • @mpapec 我喜欢这个想法,在最好的情况下,这仍然会使我的等待时间接近我仅在最长的目录上执行此代码的时间吗?如果是这样,这不是一个坏主意,但不幸的是,我的大多数目录都少于 50 个文件,而一两个文件有数千个。我很想找到一种方法来避免完全读取目录中的每个文件。

标签: perl unix count directory solaris


【解决方案1】:

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

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),您可能有更复杂和更轻量级的方法来执行此操作,但是像上面那样流式传输 dir 和您一样好'可以随身携带。

【讨论】:

  • 我喜欢它。我想你是对的。我现在想远离文件系统特定的解决方案。将来我可能会走这条路,但我想让这个东西尽可能便携。谢谢!这加快了一些速度。速度不是很快,但确实有帮助。
【解决方案2】:

保持简短。

@files = readdir(DIR) - 2;

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

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

找到 1 个文件

【讨论】:

  • 您假设任何目录中恰好有 2 个点文件是一个非常不安全且经常不正确的假设。此外,要求允许排除特定配置文件的问题。最后这个建议并不比前面的快,因为瓶颈是上面解决方案中存在的读取操作。
  • -1 有点问题。 readdir 在标量上下文中返回下一个目录条目,而不是(剩余?)条目的数量。然后从这个文件名中减去两个,这可能会转换为数值零。然后,您将标量 -2 分配给列表。正如@Andrew 指出的那样,无论如何,OP 都需要排除所有点文件和其他特定模式。
猜你喜欢
  • 2015-08-19
  • 2014-04-17
  • 2023-03-22
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2010-10-17
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多