2010-11-29 35 views
1

全部 我有大量的實時數據需要儘可能快地處理。C中大內存的問題#

這些數據來自多個網絡連接線程。

所有網絡線程將數據傳遞到共享功能進行一些譯釋恢復了數據,在此之後它保存的信息進入併發字典由對象物體。

問題是我有一個數量的abjects可能達到150K存儲在這本字典。

發生什麼事是取出對象來更新它需要很多時間,而不是接受的時間。

public class MyObject 
{ 
    System.Timers.Timer LostTimer = new System.Timers.Timer(); 
    public int ID; 
    public DateTime UpdateTime; 

    public MyObject() 
    { 
    LostTimer.Interval = 20000; 
    LostTimer.Elapsed+=TimerElapsedHandler(LostTimer_Elapsed); 
    LostTimer.Enabled = true; 
    } 

    void LostTimer_Elapsed(object sender,EventArgs e) 
    { 
    if(UpdateTime > DateTime.Now.AddSeconds(-20)) 
     Console.WriteLine(ID + " Lost..."); 
    } 

} 

public class MyClass 
{ 
    public MyClass(){} 

    private ConcurrentDictionary<int,MyObject> Objects = new ConcurrentDictionary<int,MyObject>(); 

    void NetworkThread1DataRecived(eventArgs e) 
    { 
    Translate(e.Data); 
    } 
    void Translate(string[] data) 
    { 
    Task.Factory.StartNew(()=> 
    { 
     Parallel.ForEach(data, s (()=> 
     { 
     MyObject o = null; 
     Objects.TryGet(int.Parse(s),out o) 
     if(o == null) 
     {  
      o = new MyObject(); 
      o.ID = int.Parse(s); 
      o.UpdateTime = DateTime.Now; 

      Objects.TryAdd(s,o); 
     } 
     else 
     { 
      o.UpdateTime = DateTime.Now; 
     } 
     }); 
    }); 
} 
} 

現在,當處理超過30K的對象時,它會使對象丟失。請我需要幫助迫切

的邏輯是,我減去當前系統時間的對象寬限期,並與最後更新時間爲對象進行比較。 你認爲這種類型的線程安全數組(Dictionary)不能處理這麼大量的數據,並導致read./write訪問延遲導致對象丟失嗎?我之前使用List和Lock(Object){}來處理多線程訪問這個共享內存,但它在10K對象後失敗。 將其更改爲字典(.Net在線程安全列表中生成)後,它可以很好地處理30K。 我的目標是達到150K,我可以用這個邏輯達到它,或者你有更好的想法。

+0

您的代碼將無法編譯 - 由於LHS是一個int並且RHS是DateTime,所以`UpdateTime> DateTime.Now.AddSeconds(-20000)`無效。如果我們看不到一些真實的代碼,就很難診斷問題。同樣,你對Parallel.ForEach的調用看起來不正確,在語法上... – 2010-11-29 08:29:01

+0

我糾正了它,很抱歉它是一個發佈錯誤,代碼有邏輯錯誤,而不是它在語法上都很好編譯。謝謝 – 2010-11-29 09:35:27

回答

3

因此,對於添加的每個對象(30K對象),您都會創建一個計時器。這就是30.000個計時器。

我認爲這造成了很多開銷。

如果這只是記錄/審計,您應該在1個計時器中執行此操作。可能創建一個您想要記錄的對象的單獨列表/字典。