3

次のようなデータがあります。

1 10
1 30
1 40
1 10
2 20
2 20
2 30
3 50
3 10
3 10
3 10
4 20
4 10

最初の列の値が一致する場合、すべての値を合計したいと思います。結果は次のようになります。

1 90
2 70
3 80
4 30

私はここに私のコードを持っています、

while (<DATA>) 
{
my ($a, $b) = split;
$hash{$a}  += $b;
}

foreach $a (sort keys %hash) 
{
$b = $hash{$a};
print OUT "$a $b\n";
}

サンプルデータ (約 100MB) で動作しますが、実際のデータ (約 100G) を処理するには時間がかかるようです。コードを最適化する方法はありますか?

事前にアドバイスをいただければ幸いです。

4

3 に答える 3

3

他の人が述べたように、最も可能性の高いボトルネックはハッシュや Perl ではなく、ディスク アクセスです。

ファイルを小さなチャンクに分割します。(可能であれば、標準の Unix ユーティリティを使用します)。

それらを SEPARATE IO ソース (理想的には異なるコントローラー上の異なるディスク、理想的には異なる PC 上の異なるディスク) に保存します。

  • キーの数が少ない場合 (キーごとに 100 ~ 1000 行を超える場合など) は、単にチャンクを個別に実行し、それらをすべて 100 分の 1 の小さなファイルに連結して、その 1 つのファイル全体を処理します。

  • それ以外の場合は、合計を格納するデータベースを使用して処理を同期します。

于 2013-07-12T20:26:49.250 に答える