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