在perl中解析大(~12GB)文件

时间:2017-02-22 20:15:43

标签: perl

我的perl expertize是5/10。我写了一个带有2个参数的perl脚本。 Arg1 =字符串名称(~5000个字符串)和Arg2 =文件名(大小> 10GB)。该脚本应该输出另一个报告文件,该文件打印Arg2中与Arg1中的任何行匹配的每一行。 我面临的问题是,如果我将整个12GB文件作为Arg2传递,脚本只报告Arg1的一部分,但是如果我将文件拆分为100MB文件,则脚本工作正常。我相信我的脚本有一些限制,当12GB文件直接传递给它时会导致这个问题。我打开/读取Arg2文件为:while(my $ line = <$pnt_netlist&gt;){chomp $ line; ... 等等 有没有办法我可以编写脚本来让perl读取一次说100000行,然后从100001到200000等等?

部分perl代码:

################################
####      reading the strings
##################################
$nets_counter = 0 ;
open(my $pnt_nets, $nets_file) or die "Could not open file '$nets_file' $!";
while (my $nets_line = <$pnt_nets>) {
    if( $nets_line !~ /^#/ && $nets_line !~ /^$/ ) {
        $nets_line =~ s/^\s+|\s+$//g ;             # /
        $nets_array[$nets_counter] = $nets_line ;
        $nets_counter++ ;
    } ## if ##
} ## while ##

################################
####      parse file with strings
##################################
sub search_net_in_netlist {
    $reported_nets_counter = 0;
    open(my $pnt_netlist, $netlist_file) or die "Could not open file '$netlist_file' $!";
    $last_line = "\n" ;
    while (my $line = <$pnt_netlist>) {
        chomp $line;

        if ( $line !~ /\+/ && 
             $last_line =~ /$nets_array[$i]/ && $last_line !~ /^\s*$/ ) 
        {
            my $inst_name =  @{[$last_line =~ m/\w+/g]}[0];  # /
            for($j = 0; $j < $nets_counter ; $j++) {
                $check_net_line = locate_net ($nets_array[$j], $last_line);
                @check_net_line_1 = split(/ +/, $check_net_line);
                $flag = @check_net_line_1[0];
                $reprot_line = "$check_net_line_1[1] $check_net_line_1[2] $check_net_line_1[3]";
                if( $flag == 1 ) { 
                    print "$reprot_line \n" ;
                } ## if ##
            } ## for ##
        } ## if ##
        if( $line =~ /\+/ ) {
            $last_line = "$last_line $line";
        } else { 
            $last_line = $line ;
        } ## if else ##

} ## while ##

0 个答案:

没有答案