マルチスレッドアプリケーションがあり、2つのリストo1とo2のCompareRowを比較して類似性を取得し、リストにo1.CompareRow、o2.CompareRow、 getSimilarityプロセスは非常に時間がかかる、と1000年よりも通常より多くのデータなので、手助けする必要があり、マルチスレッドを使用しているが、実際に、それはplsは、 ヘルプポイントアウトではないので、私はすでに検討し、いくつかのものがありますマルチスレッドではパフォーマンスは向上しませんが、パフォーマンスは向上しません。
1. Database shouldnot be a problem, cause i already load the data into
two List<>
2. There is no shared writable data to complete
3. the order of the records is not a problem
plsヘルプ緊急のため締め切りが近づいています....
public class OriginalRecord
{
public int PrimaryKey;
public string CompareRow;
}
===============================================
public class Record
{
// public ManualResetEvent _doneEvent;
public string r1 { get; set; }
public string r2 { get; set; }
public float similarity { get; set; }
public CountdownEvent CountDown;
public Record(string r1, string r2, ref CountdownEvent _countdown)
{
this.r1 = r1;
this.r2 = r2;
//similarity = GetSimilarity(r1, r2);
CountDown = _countdown;
}
public void ThreadPoolCallback(Object threadContext)
{
int threadIndex = (int)threadContext;
similarity = GetSimilarity(r1, r2);
CountDown.Signal();
}
private float GetSimilarity(object obj1, object obj2)
{
//Very time-consuming
ComparisionLibrary.MatchsMaker match
= new ComparisionLibrary.MatchsMaker (obj1.ToString(), obj2.ToString());
return match.Score;
}
}
================================================================
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
List<OriginalRecord> oList1=... //get loaded from database
List<OriginalRecord> oList2 =... //get loaded from database
int recordNum = oList1.Count * oList2.Count;
CountdownEvent _countdown = new CountdownEvent(recordNum);
Record[] rArray = new Record[recordNum];
int num = 0;
for (int i = 0; i <oList1.Count; i++)
{
for (int j = 0; j < oList2.Count; j++)
{
//Create a record instance
Record r
=new Record(oList1[i].CompareRow,oList2[j].CompareRow,ref _countdown);
rArray[num]=r;
//here use threadpool
ThreadPool.QueueUserWorkItem(r.ThreadPoolCallback, num);
num++;
}
}
_countdown.Wait();
List<Record> rList = rArray.ToList();
PopulateGridView(rList);
}
ここに私がデバッグモードでキャプチャした写真があります 2つのことが私の注目を集めています 1.動作するように作成されたスレッドは4つだけですが、スレッドプールのminthreadsを10に設定しました。 2.時々スレッドのどれもが道で を作業していない4つのスレッドが作成されますが、一つだけのスレッドが任意の時点で働いて、さらに悪いことに がされ、ComparisionLibraryは私が
は、私はカント重い仕事にポストを行うにダウンロードするライブラリです写真、あなたは私にあなたに写真を送ることができる電子メールかsthを残すpls、ありがとう、ありがとう。
スレッドプールの代わりにPLINQ http://msdn.microsoft.com/en-us/library/dd997425.aspxを使用することをお勧めします。あなたはそれを簡単に行うことができます。 –
私は試しましたが、実際にはパラレルではありません。レコードr =新しいレコード(o1.CompareRow、o2.CompareRow); rList.Add(r()は新しいレコード(o1.CompareRow、o2.CompareRow)、rList.Add(r1、state1、i1) );});}); rList is concurrentBag –
plinq(parallel for)の使用をお勧めします。また、プロセッサに十分な物理コアがない場合(ハイパースレッディングは必ずしも宣伝されているとは限りません)、複数のスレッドでプログラムを実行すると実際はすべてが遅くなることに注意してください。 – linkerro