【发布时间】:2012-01-22 23:44:04
【问题描述】:
是否有任何快速且内存效率高的方法来读取大文件的特定行,而无需将其加载到内存中?
我编写了一个 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-ish”的方式,和这个一样快且内存效率高?
如您所知,在 Perl 中创建一个 fork 进程会复制主进程内存 - 所以如果主进程使用 10MB,fork 将至少使用那么多。
我的目标是保持 fork 进程(所以在运行 fork 之前的主进程)内存使用尽可能低。这就是为什么我不想将整个文件加载到内存中。
【问题讨论】:
-
顺便说一句,这是
IGNORE,而不是_IGNORE_。