如何优化这个Perl文件?
要求:获取输入目录下符合以下条件的目录数如何优化这个Perl文件?,perl,file-find,Perl,File Find,要求:获取输入目录下符合以下条件的目录数 目录可以有除“DIR1”、“DIR2”、“DIR3”等以外的任何名称 “DIR1”、“DIR2”、“DIR3”等目录中的目录不需要计数 只需要目录数,没有文件 这段代码提供了所需的输出,但需要花费相当多的时间 请建议改进此代码以减少所需时间的方法。可以完全跳过整个分支 use warnings; use strict; use File::Find::Rule; my $start_dir = shift || '.'; my $re_skip =
use warnings;
use strict;
use File::Find::Rule;
my $start_dir = shift || '.';
my $re_skip = qr/DIR(?:1|2|3)/;
my $ok = File::Find::Rule->directory; # add selection rules as needed
my $skip = File::Find::Rule->directory
->name(qr/$re_skip/)
->prune
->discard;
my @dirs = File::Find::Rule -> any($skip, $ok) -> in($start_dir);
print "Total: ", scalar @dirs, "\n";
对于大型文件系统,这仍然需要一些时间,但会更好
在一行中,如果您只需要快速计数
perl -MFile::Find::Rule -wE'
$ffr = File::Find::Rule;
$skip = $ffr->directory->name(qr/DIR(?:1|2|3)/)->prune->discard;
say scalar $ffr->any($skip, $ffr->directory)->in(".")'
我整合了脚本中的一些代码
下一步是使用多线程执行(我在这里使用
fork
)。对子目录进行分组,使它们的子目录数大致平衡,并在这些组上并行运行上述内容。收益将取决于您的硬件,但应该有一个很好的加速因子。有多少目录?我投票将这个问题作为离题题来结束,因为它是关于代码审查的,应该在@simbabque询问大约50万个文件。嗯,这是很多文件。您的正则表达式是错误的,它应该是$directory=~m/DIR1/
,而不是双引号“”
。您可以将它们组合成一个模式,并在循环之外编译它<代码>我的$pattern=qr/DIR[123]/;如果$director=~$pattern,则查找…,然后将其与下一步一起使用。显然,您的模式更复杂,因此请相应地进行调整。可能有助于创建一个好的模式。File::Find
无法修剪/跳过整个目录分支,但您可以尝试一下,谢谢@zdim!使用文件查找规则将所用时间减少了一半。。不过,还是要尝试多线程。@king很好,它应该是这样的。让我知道如果一些分叉代码会有帮助,我可以添加它。
perl -MFile::Find::Rule -wE'
$ffr = File::Find::Rule;
$skip = $ffr->directory->name(qr/DIR(?:1|2|3)/)->prune->discard;
say scalar $ffr->any($skip, $ffr->directory)->in(".")'