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个小时来处理
建立一个查找表。
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 倍以上。我们说的是几秒钟,而不是几小时。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |