3

複数の大きな配列のハッシュ (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 自体を、可能な限り効率的に複数回サブルーチンに渡すことができる必要があります。

4

4 に答える 4

1

whileループを使用するのではなく、大きなファイルを持っているので、モジュールFile::Slurpを使用して完全なファイル丸呑みを行うことをお勧めします。

File::Slurp read_file 関数は、sysread ( read_file ソース コードをチェック) 呼び出しを使用して perl I/O をバイパスしようとします。

my $text = read_file( $file ) ;

于 2013-04-01T07:52:22.803 に答える