HashSet
バイナリ ファイルを読み取って生成されたカスタム オブジェクトが含まれています。また、DBF ファイルの各行を読み取って生成された辞書もあります。互いに一致する両方にインデックス プロパティがあります。たとえば、my Dictionary の 10 番目の項目は my の 10 番目の項目と並んでいHashSet
ます。
大量のデータを相互に比較しています。10,000 から 500,000 のレコードが存在する可能性があります。アプリケーションは、他の 2 つのファイル (1 つはバイナリ、もう 1 つは dbf) の違いをチェックします。オブジェクトの をチェックしHashCode
ます (特定のプロパティによって生成され、この比較を迅速かつ簡単に行います)。
個々の辞書を作成する方法は次のとおりです (mod にも同様の辞書があります)。
foreach (DataRow row in origDbfFile.datatable.Rows)
{
string str = "";
foreach (String columnName in columnNames)
{
str += "~" + row.Field<Object>(columnName);
}
origDRdict.Add(d, str);
d++;
}
2 つのファイル間の列は常に同じです。ただし、列が異なる2つの異なるファイルに遭遇する可能性があります。基本的に、すべてのデータを辞書検索用の文字列に出力します。データが異なる場合にのみ、DBF ファイルをもう一度ヒットしたいだけです。
これがDBルックアップのコードです。(!foundIt)
if
これで違いが見つかります。ブロックの ELSE セクションを実行すると、非常に遅くなります。削除すると、見つからないすべてのアイテムを一覧表示するのに 1 分しかかかりません。
foreach (CustomClass customclass in origCustomClassList) {
Boolean foundIt = false;
if (modCustomClassList.Contains(customclass))
{
foundIt = true;
}
//at this point, an element has not been found
if (!foundIt)
{
notFoundRecords.Add(customclass);
}
//If I remove this entire else block, code runs fast.
else //at this point an element has been found
{
//
//check 'modified' dictionary array
if (!(modDRdict.ContainsValue(origDRdict[i])))
{
//at this point, the coordinates are the same,
//however there are DB changes
//this is where I would do a full check based on indexes
//to show changes.
}
}
i++; //since hashsets can't be indexed, we need to increment
}
私が試したこと/その他の考え
カスタム オブジェクトの生成
HashSet
、整数のインデックスを持つカスタム オブジェクト、および列と値の長さである文字列ブロックを削除
if (!(modDRdict.ContainsValue(origDRdict[i])))
すると、コードが大幅に高速化されます。2 つの 440,000 レコード ファイル間で削除されたレコードを反復する時間は、わずか 1 分です。辞書検索は永遠にかかります!foreach
ループ内のforeach
ループがオーバーヘッドを引き起こしすぎているとは思いません。コード内に保持してもルックアップを行わない場合でも、高速に実行されます。