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