有没有快速和内存有效的方法来读取大文件的特定行,而无需将其加载到内存?
我编写了一个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;
}
Run Code Online (Sandbox Code Playgroud)
它的速度很快而且很有效 - 但也许有更多的"Perl-ish"方式,就像这个一样快速和内存效率?
如您所知,在Perl中创建fork进程会复制主进程内存 - 因此,如果主进程使用10MB,则fork将使用至少那么多.
我的目标是保持fork进程(所以主要进程直到运行forks)内存使用尽可能低.这就是为什么我不想将整个文件加载到内存中.
fri*_*edo 17
在你走得更远之前,了解它是如何fork工作的很重要.当您fork进行处理时,操作系统使用写时复制语义来共享大部分父进程和子进程的内存; 只需要单独分配父和子之间不同的内存量.
要在Perl中读取单行文件,这里有一个简单的方法:
open my $fh, '<', $filePath or die "$filePath: $!";
my $line;
while( <$fh> ) {
if( $. == $lineWanted ) {
$line = $_;
last;
}
}
Run Code Online (Sandbox Code Playgroud)
这使用$.保存当前文件句柄的行号的特殊变量.