次のような大きな単語リストがあります(このデータはdbからのものです):
[
{
keyword => 'bmw.*red.*1999',
owner => 'someone'
#... other attributes
},
{
keyword => 'toyota.*black.*1999',
owner => 'someone else'
#... other attributes
},
# and so on ... up to 300 different keywords in a list
]
「キーワード」を他の多くのリストと定期的に照合する必要があります。このキーワードリストは、「キーワード」を正規表現にコンパイルするたびに使用されるため:
map { $_->{_compiled} = qr/$_->{keyword}/i } @keywords;
すべてのキーワードを他のリストのすべての要素と比較します。
foreach my $other in (@other) {
foreach my $keword (@keywords) {
if ($other->{name} =~ $keyword->{_compiled}) {
## do something with $other and $keyword
}
}
}
これらの操作は 10 分ごとに実行する必要があり、約 50 個のキーワード リスト (最大 300 個の要素を含む) と、これらのキーワードに対してチェックされる他の 50 個のリストが必要です。そして成長するはずです。
マッチング速度を可能な限り最適化したいのですが、2 つのアイデア/問題があります。
後で使用するためにコンパイル済みの正規表現 ($keyword->{_compiled}) をデータベースに保存しますが、これがどの程度役立つかはわかりません (ベンチマークは行っていません)。
すべての「キーワード」または「_compiled」を 1 つの大きな正規表現に結合し、1 つのステップですべてを比較します。
コード:
my @compiled = grep { $_->{_compiled} } @keywords;
# or is this better?
my $rx = "(".(join "|", grep { $_->{keyword} } @keywords).")";
my $compiled = qr/$rx/i;
foreach my $other in (@other) {
if ($other->{name} =~ @compiled) {
## do something with $other and $keyword
##
## but now there is no way to get "owner" of matched keyword
}
}
私の「問題」は、一致したキーワードの「所有者」やその他の属性を使用できる必要があることです。すべてを1つの大きな正規表現に結合するか、_compiledを配列に入れると、一致できません
大きなリストと大きなリストを正規表現比較する「最良の解決策」はありますか? パフォーマンスの問題について心配する必要があるかどうかさえわかりませんが、リストは大きくなり、準備したいと思います.