我有一个名为 Lib 的文件夹,我正在使用 File::Find 模块在整个目录中搜索该文件夹,例如 D:\
.搜索需要很长时间,如果驱动器有很多子目录,甚至需要 5 分钟。如何更快地搜索该 Lib,以便在几秒钟内完成?
我的代码如下所示:
find( \&Lib_files, $dir);
sub Lib_files
{
return unless -d;
if ($_=~m/^([L|l]ib(.*))/)
{
print"$_";
}
return;
}
最佳答案
在没有预先存在的索引的情况下搜索文件系统是 IO 绑定(bind)的。否则,产品范围为 locate
至Windows Desktop Search将不存在。
输入 D:\> dir /b/s > directory.lst
并观察该命令运行需要多长时间。如果不首先索引文件,您不应该期望击败它。
您可以做出的一项重大改进是减少打印频率。如果您不打算捕获,一个小的改进是不使用捕获括号:
my @dirs;
sub Lib_files {
return unless -d $File::Find::name;
if ( /^[Ll]ib/ ) {
push @dirs, $File::Find::name;
}
return;
}
在我的系统上,一个使用
File::Find
的简单脚本与 dir %HOME% /ad/b/s > dir.lst
相比,打印包含大约 150,000 个文件的主目录下所有子目录的名称需要几分钟的时间。这在大约 20 秒内完成。我倾向于使用:
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ }
split /\n/, `dir %HOME% /ad/b/s`;
在我的系统上不到 15 秒就完成了。
如果有机会还有其他的
dir.exe
在 %PATH%
, cmd.exe
的内置 dir
不会被调用。您可以使用 qx! cmd.exe /c dir %HOME% /ad/b/s !
确保正确的 dir
被调用。
关于performance - 如何使 Perl 的 File::Find 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1783631/