ファイルからデータベースにデータをロードする成熟したコードがあります。 いくつかのファイル形式があります。それらはすべて固定幅のフィールドです。Perlの固定幅データの処理を高速化するにはどうすればよいですか?
一部のコードでは、Perl unpack()
関数を使用して、入力データのフィールドをパッケージ変数に読み込みます。 ビジネスロジックは、これらのフィールドを「人間が読める」方法で参照することができます。
ファイルの読み取りコードは、ファイルを読み取る前に、フォーマット記述から1回生成されます。スケッチ形式で
、生成されたコードは次のようになります。コードをプロファイリング
while (<>) {
# Start of generated code.
# Here we unpack 2 fields, real code does around 200.
($FIELDS::transaction_date, $FIELDS::customer_id) = unpack q{A8 A20};
# Some fields have leading space removed
# Generated code has one line like this per affected field.
$FIELDS::customer_id =~ s/^\s+//;
# End of generated code.
# Then we apply business logic to the data ...
if ($FIELDS::transaction_date eq $today) {
push @fields, q{something or other};
}
# Write to standard format for bulk load to the database.
print $fh join('|', @fields) . q{\n} or die;
}
時間の約35%がアンパックとリーディングスペースストリップに費やされていることが明らかになりました。 残りの時間は、データの検証と変換、および出力ファイルへの書き込みに費やされます。
ランタイムの1〜2%を占めるビジネスロジックの部分がないようです。
質問は - 私たちは何とかアンパックとスペースストリッピングから少しスピードを出せますか?好ましくは、FIELDSパッケージ変数を参照するすべてのコードをリファクタリングする必要はありません。
EDIT:場合
それは違い
$ perl -v
This is perl, v5.8.0 built for PA-RISC1.1
アンパックの左側のパッケージ変数のリストの使用が最適である可能性があるかどうかを知りたいと思うでしょうか。 –