2

doyble ループを介して各行を相互に比較しながら、100 行から 10000 行のデータテーブルをローピングしています。

for (int i = 0; i < DT1.Rows.Count; i++)
{
    for (int j = 0; j < DT1.Rows.Count; j++)
    {
        //some code to compare data
    }
}

100 ~ 200 行の場合は数分で完了しますが、数千行を数千行と比較すると数時間かかり、完了しません。

スピードアップするにはどうすればよいですか?私が考えた最善の方法は、データテーブルの代わりにオブジェクトのリストを使用することです。

他の提案はありますか?

これを行うためにスレッドを使用できますか?

ありがとう。

4

6 に答える 6

5

私は最近、私が解決しなければならなかった同様のシナリオに出くわしました。私の場合は、Excelファイルのペアを比較していました。私の試運転では、動作させた後、ネストされたループ内の片側に530​​行、反対側に459000行がありました。これは約2億3400万回の反復です。私のプログラムは約30秒でそれを処理することができました。このシナリオではforeachを使用しました。

foreach (DataRow r1 in DT1.Rows) //Loop the First Source data
{
    foreach (DataRow r2 in DT2.Rows) //Loop the Second Source data
    {
         //Comparison code here...
    }
}

編集:ループでは、参照ポイントとして、ループの各反復で3つの変数を追跡します。1番目と2番目はカウンターです。3つ目は、パフォーマンスに大きな影響を与えるDT1.Rows.Countです。ループの一部として直接行数を使用することにより、反復ごとに再評価する必要があります。これにより、プログラムに不要な時間が追加されます。カウンタがどうしても必要な場合は、最初に行カウントを割り当てます。

int DT1Count = DT1.Rows.Count;
for (int i = 0; i < DT1Count; i++)
{
    for (int j = 0; j < DT1Count; j++)
    {
        //some code to compare data
    }
}

このように、行数は静的であり、各反復で行数を評価するために必要な余分な処理を削除します。

于 2012-11-12T21:02:43.127 に答える
1

確かにハッシュ テーブルを使用して検索を最適化することはできますが、最良の最適化は、データベース エンジンに検索を任せることです。RDBMS エンジンは、この種のタスク向けに最適化されています。クライアント側の最適化でこれに勝るものはありません。最大の欠点は、データベースからプログラムにデータをプルしなければならないことです。これは非常に遅いです。データベース エンジンはすべてのデータをすぐそこに持っています。これは大きな利点です。

たとえば、姓と名が同一のユーザーを表す行を探している場合、自己結合を使用した単純なクエリでは、データがエンジンを離れることがないため、数分ではなく数秒で結果が得られます。

select u1.userId, u2.userId
from User u1
join User u2 on u1.FirstName=u2.FirstName and u1.LastName=u2.LastName

FirstNameと列がインデックス化されていると仮定するとLastName、このクエリは重複を非常に迅速に見つけます。

于 2012-10-11T10:44:37.917 に答える
0

次を使用して手動ループよりも優れた仕事をするために、.NET 内部を利用することもできます。

DataTable.Select(filterExpression, sortExpression)
于 2012-10-11T10:49:21.103 に答える
0
    for (int i = 0; i < DT1.Rows.Count; i++)
    {
      for (int j = i+1; j < DT1.Rows.Count; j++) //<-- starts from next row
      {
        //some code to compare data
      }
    }
于 2012-10-11T10:43:47.523 に答える
0

結果が何らかの順序でソートされている場合、結果を配列に入れ、バイナリ検索を使用してループすることができます

于 2012-10-11T10:41:39.527 に答える
0

ここで行う最大の最適化は次のとおりです。
現在、各値を 2 回比較しています。たとえば、ループの最初の繰り返しでは、両方のループがインデックス 0 から始まるため、最初の行をそれ自体と比較しています。

これに対する最も簡単な修正は、内側のループを次のように変更することです。

for (int j = i + 1; j < DT1.Rows.Count; j++)

これにより、比較の数が大幅に減少します。現在、アルゴリズムにはn^2比較が必要です。提案された修正により、この数は半分以下に減少します。この修正により、必要なのは(n^2 - n) / 2比較だけです。

于 2012-10-11T10:42:43.147 に答える