=================Perl: Самый быстрый способ найти файлы старше X минут, отсортированные по старейшему и новейшему?
1. Найдите файлы старше X количество минут
2. Процесс их от старых к новым
Код ниже работает нормально, однако каталог содержит 3 миллиона файлов. Поэтому мне нужно оптимизировать его, чтобы быстрее находить файлы. Мне не нужно беспокоиться о содержимом файла, просто имя.
###########################
sub get_files_to_process{
###########################
# Declare arrays
my @xmlfiles;
my @qulfiedfiles;
# Declare a Dictionary
my %filedisc;
opendir(my $dh, $maindir) or die "opendir($maindir): $!";
# Read all the files
while (my $de = readdir($dh)) {
# get the Full path of the file
my $f = $maindir . $de;
# If File is there and has .xml Extension
if (-f $f && $f=~ /\.xml/){
# Put it in a XMLFILES Array
push (@xmlfiles, $f); }
}
closedir($dh);
# For every file in directory
for my $file (@xmlfiles) {
# Get stats about a file
my @stats = stat($file);
# If time stamp is older than minutes provided
if ($stats[9] <= ($now - (($minutesold * 60)))){
# Put the File and Time stamp in the dictionary
$filedisc{$file} = $stats[9];
}
}
# For every file in the dictionary sort based on the timestamp oldest files first
for my $x (sort {$filedisc{$a} <=> $filedisc{$b} or $a cmp $b } keys %filedisc) {
# Put the qualified files (Based on the age) in a list
push(@qulfiedfiles, $x);}
UPDATE: До сих пор это кажется перспективным, более тестирование должно быть сделано:
##########################
sub get_files_count{
##########################
my $cmd= "find $maindir -maxdepth 1 -name '*.xml' -mmin +$minutesold -printf \"%T+\t%p\\n\"| sort";
my @output = `$cmd`;
if (@output){
foreach my $line (@output){
chomp $line;
push (@files2process, (split '\t', $line)[ -1 ]);
}
}
}
Я не тестировал ваш код в каталоге с 3_000_000 записей. Прежде чем мы начнем говорить о способах оптимизации кода, почему бы вам не использовать 'Devel :: NYTProf', чтобы определить, где ваш код тратит больше времени? – DavidO
Как вы обрабатываете файлы после того, как у вас есть список? – ThisSuitIsBlackNot
@ThisSuitIsBlackNot, Как только у меня есть список файлов, я основываясь на имени файла, я перемещаю файл в соответствующие подкаталоги (и создаю sub-dir, если он еще не существует), этот скрипт будет работать из cron каждый От 5 до 10 минут, приложение Enterpise генерирует тонны xml-файлов, и это ухаживает за этими файлами. – Grene