Недавно я столкнулся с ситуацией, когда мне нужно обрезать некоторые довольно большие файлы журналов, когда они превышают определенный размер. Все, кроме последних 1000 строк в каждом файле, удаляется, задание запускается каждые полчаса с помощью cron. Мое решение состояло в том, чтобы просто просмотреть список файлов, проверить размер и при необходимости обрезать.
for $file (@fileList) {
if ( ((-s $file) / (1024 * 1024)) > $CSize) {
open FH, "$file" or die "Cannot open ${file}: $!\n";
$lineNo = 0;
my @tLines;
while(<FH>) {
push @tLines, $_;
shift @tLines if ++$lineNo < CLLimit;
}
close FH;
open FH, ">$file" or die "Cannot write to ${file}: $!\n";
print FH @tLines;
close FH;
}
Это работает в текущей форме, но для больших файлов журналов (особенно тех, которые содержат более 100_000 строк) возникает много накладных расходов из-за необходимости читать каждую строку и при необходимости сдвигать.
Есть ли способ, которым я мог бы прочитать только часть файла, например. в этом случае я хочу иметь доступ только к последним строкам «CLLimit». Поскольку сценарий развертывается в системе, которая знавала лучшие дни (например, Celeron 700 МГц с 64 МБ ОЗУ), я ищу более быструю альтернативу с использованием Perl.