Почему код для разделения больших файлов, написанных на Perl, работает намного быстрее кода, написанного на Korn Shell.Более миллиона входных записей.Первые 9 символов каждой записи используются для определения того, в какой файл записана запись, и это выполняется в Perl за 4-5 минут.Я попытался преобразовать этот код в ksh, и он, кажется, работает вечно (часы).
Я действительно понятия не имею, что я сделал неправильно, что вызывает эту проблему.В некоторых записях в строку встроены пустые и / или буквенные символы, поэтому сравнение должно быть сравнением типа строки.Любые идеи о том, как заставить мой сценарий ksh получить производительность perl или почему это не так?
Я пробовал несколько разных вариантов, так как ksh / bash имеет много способов сделать то же или подобное в обработке переменныхи сравнения.Я также не знаю, как именно работает этот очень старый Perl-код.
Мой Perl-код:
open(FILEIN,"base.dat") || die "Could not open FILEIN\n.";
open(FILEOUT1,">base1.dat") || die "Could not open FILEOUT1\n.";
open(FILEOUT2,">base2.dat") || die "Could not open FILEOUT2\n.";
open(FILEOUT3,">base3.dat") || die "Could not open FILEOUT3\n.";
$v_break = "518000000";
$v_break2 = "525000000";
#Run until end of file
while (<FILEIN>) {
$v_pcn = substr($_, 0, 9);
if ($v_break gt $v_pcn) {
print FILEOUT1 $_;
}
elsif (($v_pcn ge $v_break) && ($v_pcn lt $v_break2)) {
print FILEOUT2 $_;
}
else
{
print FILEOUT3 $_;
}
} #(<FILEIN>)
close(FILEIN);
close(FILEOUT1);
close(FILEOUT2);
close(FILEOUT3);
Мой сценарий оболочки (ksh):
while read inrec # Read base file until EOF
do # Start work loop
v_pcn=${inrec:0:9} # Get 1st 9 Characters in v_pcn
# v_pcn=${v_pcn/' '/0} # Replace blanks with '0'
if [[ $v_pcn < '518000000' ]]; then # pcn < "518000000"
echo $inrec >> base1.dat # write rec to "base1.dat"
elif [[ $v_pcn > '525000000' || $v_pcn == '525000000' ]]; then # pcn >= "525000000"
echo $inrec >> base3.dat # write rec to "base3.dat"
else # else >= "518000000" & < "525000000"
echo $inrec >> base2.dat # write rec to "base2.dat"
fi
done < base.dat
Я ожидаю, что сценарий оболочки выдаст 3 выходных файла, соответствующих тем, которые были созданыPerl-код и примерно столько же времени;
ввод:
-rw-r--r--. 1 mfadjobt mfadset 2095795750 Feb 13 10:07 base.dat
вывод:
-rw-r--r--. 1 mfadjobt mfadset 461650125 Feb 13 10:07 base1.dat
-rw-r--r--. 1 mfadjobt mfadset 519783625 Feb 13 10:07 base2.dat
-rw-r--r--. 1 mfadjobt mfadset 1114362000 Feb 13 10:07 base3.dat