优化 Perl 脚本以关联两个文件之间的记录

Akh*_*il 5 perl

open( FH, 'MAH' ) or die "$!";
while ( $lines = <FH> ) {
    $SSA = substr( $lines, 194, 9 );
    open( FH1, 'MAH2' ) or die "$!";
    while ( $array1 = <FH1> ) {
        @fieldnames = split( /\|/, $array1 );
        $SSA1       = $fieldnames[1];
        $report4    = $fieldnames[0];
        if ( $SSA =~ /$SSA1/ ) {
            $report5= $report4;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图从 MAH 文件中提取“SSA”值并在 MAH2 文件中搜索该值。如果找到,则返回“report4”值。我能够获得输出,但需要大量时间来处理。有什么方法可以优化代码使其快速完成?

我的每个文件都有 300,000 条记录,文件大小为 15 MB。目前需要5个小时来处理

ike*_*ami 6

建立一个查找表。

my $foo_qfn = 'MAH';
my $bar_qfn = 'MAH2';

my %foos;
{
   open(my $fh, '<', $foo_qfn)
      or die("Can't open \"$foo_qfn\": $!\n");

   while ( my $foo_line = <$fh> ) {
      my $ssa = substr($foo_line, 194, 9);
      $foos{$ssa} = $foo_line;
   }
}

{
   open(my $fh, '<', $bar_qfn)
      or die("Can't open \"$bar_qfn\": $!\n");

   while ( my $bar_line = <$fh> ) {
      chomp($bar_line);
      my ($report4, $ssa) = split(/\|/, $bar_line);
      my $foo_line = $foos{$ssa};
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

您的原始代码花费的时间与 foos 数量乘以条形数量 (O(N*M)) 成正比。

这将花费与 foos 数量和 bar 数量(O(N+M))中的最大者成正比的时间。

换句话说,这应该快 100,000 倍以上。我们说的是几秒钟,而不是几小时。