有没有一种快速、内存高效的方法可以读取大文件的特定行,而不需要将其加载到内存中?
我写了一个perl脚本,它运行了许多forks,我希望它们从文件中读取特定的行。
目前,我正在使用外部命令:
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中创建一个fork进程会复制主进程的内存 - 因此,如果主进程正在使用10MB,fork至少也会使用这么多。
我的目标是尽可能地减少fork进程(包括运行forks之前的主进程)的内存使用。这就是为什么我不想将整个文件加载到内存中的原因。
IGNORE
,而不是_IGNORE_
。 - ikegami