私のタスクには非常に遅い機能があります(10〜100倍速くなければなりません)
ここにコードがあります
public long Support(List<string[]> sequences, string[] words)
{
var count = 0;
foreach (var sequence in sequences)
{
for (int i = 0; i < sequence.Length - words.Length + 1; i++)
{
bool foundSeq = true;
for (int j = 0; j < words.Length; j++)
{
foundSeq = foundSeq && sequence[i + j] == words[j];
}
if (foundSeq)
{
count++;
break;
}
}
}
return count;
}
public void Support(List<string[]> sequences, List<SequenceInfo> sequenceInfoCollection)
{
System.Threading.Tasks.Parallel.ForEach(sequenceInfoCollection.Where(x => x.Support==null),sequenceInfo =>
{
sequenceInfo.Support = Support(sequences, sequenceInfo.Sequence);
});
}
List<string[]> sequences
単語の配列の配列はどこにありますか。通常、この配列には 25 万行以上が含まれます。各行は約 4 ~ 7 語です。 string[] words
カウントしようとしている単語の配列です (すべての単語が少なくとも 1 回連続して含まれます)。
問題はfoundSeq = foundSeq && sequence[i + j] == words[j];
. このコードは、すべての実行時間のほとんどを占めます (2 番目の Enumerable.MoveNext)。配列内のすべての単語をハッシュしたい。数値は文字列よりも速く比較されますよね? パフォーマンスの 30% ~ 80% を達成するのに役立つと思います。しかし、私は10倍が必要です!どうすればいいですか?知りたい場合は、アプリオリアルゴリズムの一部です。
サポート関数は、単語シーケンスがシーケンス リスト内の任意のシーケンスの一部であるかどうかをチェックし、その回数をカウントします。