4

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ループがオーバーヘッドを引き起こしすぎているとは思いません。コード内に保持してもルックアップを行わない場合でも、高速に実行されます。

4

1 に答える 1

3

辞書は、値ではなくキーで検索するように最適化されています。値で検索する必要がある場合は、間違った辞書を使用しています。値に HashSet を作成して含まれているかどうかをすばやく確認するか、キーが必要な場合は逆引き辞書を作成する必要があります。

于 2013-06-06T14:37:41.127 に答える