複数の大きな配列のハッシュ (HoA) データ構造を生成するスクリプトに取り組んでいます。現在、実行にかなりの時間がかかっているため、スクリプトを最適化しようとしています。
ちょっとベンチマークしてみました。スクリプトの実行を約にすることができました。@_
配列参照を利用し、変数にコピーする代わりに直接使用することでサブルーチン呼び出しのオーバーヘッドを削減することで、3.5 倍高速になります。また、不要なサブルーチンと冗長な変数宣言を削除しました。これらの改善にもかかわらず、コードをさらに高速に実行したいと考えています。
スクリプトの開始時に、大きなファイルを解析して 2 つの HoA データ構造を生成します。ハッシュ参照に関するこれらのアプローチのどれが最も実現可能で効率的ですか? HoA は次のようになります。
%HoA = (
'C1' => ['1', '3', '3', '3'],
'C2' => ['3','2'],
'C3' => ['1','3','3','4','5','5'],
'C4' => ['3','3','4'],
'C5' => ['1'],
);
オプション1
ファイルを解析しながら HoA を生成します (以下を参照)。最後に、配列のハッシュをハッシュ参照に入れます。
my $hash_ref = \%HoA;
オプション 2
HoA の各キーが array_ref を指す値を持つようにファイルを解析します。最後に、配列のハッシュをハッシュ参照に入れます。
==============
オプション 2 は良いアプローチだと思いますが、どうすればよいですか?
これが私が現在やっている方法です。
use strict; use warnings;
open(F1, "file.txt") or die $!;
my %HoA = ();
while (<F1>){
$_=~ s/\r//;
chomp;
my @cols = split(/\t/, $_);
push( @{$HoA{$cols[0]}}, @cols[1..$#cols]);
}
close F1;
値とキーをすばやく検索できる効率的なデータ構造が必要です。また、キー値 (配列)、キー、および HoA 自体を、可能な限り効率的に複数回サブルーチンに渡すことができる必要があります。