Недавно я столкнулся с ситуацией, когда мне нужно обрезать некоторые довольно большие файлы журналов, как только они вырастут до определенного размера. Все, кроме последних 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.