私はPerlで書かれたパーサーで、固定長のファイルを解析しています。レコードの一部は、数字のみで構成された複数の文字列(固定長)で構成されています。文字列の各文字は、ASCII文字ではなく数字としてエンコードされます。つまり、文字列12345がある場合、01 02 03 04 05(31 32 33 34 35の代わりに)としてエンコードされます。Perlでの結合と組み合わせたアンパックの実行
私はunpackでレコードを解析し、この特定の部分は@array = unpack "C44", $s
と解凍されています。その後、私は単純な結合で必要な文字列を復旧します($m = join("", @array)
のように)。
デコードするのに最適な方法があるのだろうかと思っていました。ファイルは非常に大きく、何百万ものレコードがあります。明らかに、最適化が可能かどうかを調べました。プロファイラは、ほとんどの時間がレコードの解析に費やされていることを示しています(つまり、読み込み、書き込みなどの問題は問題ではありません)。これらの結合によって、ほとんどの時間が解析されます。私は、他のソースから、参加はかなり効率的な操作であることを覚えています。コードの速度を上げることが可能かどうか、また最適なのは何ですか?おそらく、この中間配列を賢明な方法で回避することは可能でしょうか?たとえば、代わりにpack/unpackの組み合わせを使用しますか?
編集:コード例
私はこのようなルックスを最適化しようコード:いつものようにPerlで
while (read(READ, $buf, $rec_l) == $rec_l) {
my @s = unpack "A24 C44 H8", $buf;
my $msisdn = substr $s[0], 0, 11;
my $address = join("", @s[4..14]);
my $imsi = join("", @s[25..39]);
my $ts = localtime(hex($s[45]));
}
質問にさらにコードを追加しました。 – MariusM