Recherche sur le système de fichiers sans index est pré-existante IO lié. Sinon, les produits allant de locate
à Windows Desktop Search n'existeraient pas.
Tapez D:\> dir /b/s > directory.lst
et d'observer le temps nécessaire à l'exécution de cette commande. Vous ne devriez pas vous attendre à battre cela sans indexer les fichiers en premier.
Une amélioration majeure que vous pouvez faire est d'imprimer moins souvent. Une légère amélioration est de ne pas utiliser la capture entre parenthèses si vous n'allez capturer:
my @dirs;
sub Lib_files {
return unless -d $File::Find::name;
if (/^[Ll]ib/) {
push @dirs, $File::Find::name;
}
return;
}
Sur mon système, un script simple à l'aide File::Find
pour imprimer les noms de tous les sous-répertoires sous mon répertoire personnel avec environ 150 000 fichiers prend quelques minutes à courir par rapport à dir %HOME% /ad/b/s > dir.lst
qui se termine en environ 20 secondes.
Je serais enclin à utiliser:
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ }
split /\n/, `dir %HOME% /ad/b/s`;
qui a terminé en moins de 15 secondes sur mon système.
S'il y a une chance il y a une autre dir.exe
dans %PATH%
, cmd.exe
« s intégré dans dir
ne sera pas invoquée. Vous pouvez utiliser qx! cmd.exe /c dir %HOME% /ad/b/s !
pour vous assurer que le droit dir
est appelé.
S'il vous plaît poster le code que vous avez effectivement compilé et exécuté. –
Pourquoi est-ce DOWNVOTED ?! Je suis confronté au même problème. 'File :: Find' est très lent. – unixman83
Assurez-vous qu'une tâche d'arrière-plan ne s'exécute pas sous le planificateur de tâches Windows. C'était mon plus gros problème quand Perl prenait 5 minutes pour lister un répertoire. – unixman83