Чтение определенной строки из большого файла в Perl

Есть ли какой-нибудь быстрый и эффективный способ прочитать определенные строки большого файла, не загружая его в память?

Я написал perl скрипт, который запускает много форков, и я хотел бы, чтобы они читали определенные строки из файла.

Сейчас я использую внешнюю команду:

sub getFileLine {
    my ( $filePath, $lineWanted ) = @_;
    $SIG{PIPE} = '_IGNORE_';
    open( my $fh, '-|:utf8', "tail -q -n +$lineWanted \"$filePath\" | head -n 1" );
    my $line = <$fh>;
    close $fh;
    chomp( $line );
    return $line;
}

Это быстро и работает - но может быть есть более "Perl-шный" способ, такой же быстрый и такой же экономичный по памяти, как этот?

Как вы знаете, создание форк-процесса в Perl дублирует память основного процесса - так что если основной процесс использует 10MB, то форк будет использовать по крайней мере столько же.

Моя цель состоит в том, чтобы сохранить использование памяти fork-процессом (то есть основным процессом, пока не запущен forks) как можно более низким. Вот почему я не хочу загружать весь файл в память.

8
задан Brad Gilbert 18 December 2011 в 15:30
поделиться