加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

从Perl中的大文件中读取特定行

发布时间:2020-12-15 21:55:12 所属栏目:大数据 来源:网络整理
导读:有没有快速和内存有效的方法来读取大文件的特定行,而无需将其加载到内存? 我编写了一个perl脚本,它运行许多forks,我希望他们从文件中读取特定的行. 目前我正在使用外部命令: sub getFileLine { my ( $filePath,$lineWanted ) = @_; $SIG{PIPE} = '_IGNORE_
有没有快速和内存有效的方法来读取大文件的特定行,而无需将其加载到内存?

我编写了一个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-ish”方式,就像这个一样快速和内存效率?

如您所知,在Perl中创建fork进程会复制主进程内存 – 因此,如果主进程使用10MB,则fork将使用至少那么多.

我的目标是保持fork进程(所以主要进程直到运行forks)内存使用尽可能低.这就是为什么我不想将整个文件加载到内存中.

解决方法

在进一步研究之前,了解fork的工作原理非常重要.当您分叉进程时,操作系统使用 copy-on-write语义来共享大部分父进程和子进程的内存;只需要单独分配父和子之间不同的内存量.

要在Perl中读取单行文件,这里有一个简单的方法:

open my $fh,'<',$filePath or die "$filePath: $!";
my $line;
while( <$fh> ) {
    if( $. == $lineWanted ) { 
        $line = $_;
        last;
    }
}

这使用特殊的$.保存当前文件句柄的行号的变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读