2010-11-29 14 views
1

すべて 私は大量のリアルタイムデータをできるだけ早く処理する必要があります。Cでの大容量メモリの問題

これらのデータは、マルチネットワーク接続スレッドからのものです。

すべてのネットワークスレッドは、共有関数にデータを渡して、あるデータを復活させた後、そのデータをオブジェクトごとにコンカレント辞書に保存します。

問題は、この辞書に格納された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を超えるオブジェクトを処理すると、オブジェクトが失われます。私は緊急に助けが必要です

論理は、私は現在のシステム時間からオブジェクト猶予期間を差し引いて、そのオブジェクトの最終更新時間と比較しています。 このタイプのスレッドセーフな配列(ディクショナリ)は、この大量のデータを処理できないため、オブジェクトが失われる原因となるread/writeアクセス遅延が発生すると思いますか? 私はリストとロック(オブジェクト){}を使用してこの共有メモリへのマルチスレッドアクセスを処理していましたが、10Kのオブジェクトの後で失敗します。 辞書に変更した後(スレッドセーフリストの.Netビルド)、30Kでうまく動作します。 私の目標は150Kに到達することです、私はこの論理でそれに到達することができますか、より良いアイデアがあります。

+0

コードがコンパイルされません - LHSがintでRHSがDateTimeであるため、 'UpdateTime> DateTime.Now.AddSeconds(-20000)'は無効です。実際のコードが見えない場合は、問題を診断するのが難しいでしょう。同様に、Parallel.ForEachへの呼び出しは正しいとは言えませんが、構文的には... –

+0

私はよく修正しました。申し訳ありませんが、間違いは間違いです。ありがとう –

+0

論理は、私は現在のシステム時間からオブジェクト猶予期間を差し引いて、そのオブジェクトの最終更新時間と比較しているということです。あなたは、このタイプのスレッドセーフ配列(辞書)は、この大量のデータを処理できず、読み込み/書き込みアクセスの遅延によってオブジェクトが失われると思いますか?私はListとLock(Object){}を使用してこの共有メモリへのマルチスレッドアクセスを処理していましたが、オブジェクトが10K後には失敗します。辞書に変更した後(スレッドセーフリストの.Netビルド)、30Kでうまく動作します。私の目標は150Kに達することです –

答えて

3

したがって、追加するオブジェクトごとに(30Kオブジェクト)、タイマーを作成します。 30,000タイマーがアクティブです。

私はこれがかなりのオーバーヘッドを作り出していると思います。

ロギング/監査専用の場合は、1タイマーでこれを行う必要があります。おそらくログに記録するオブジェクトのリスト/辞書を別々に作成します。

+0

ありがとう、私は各オブジェクトタイマーを削除し、古いものの代わりにグローバルタイマーによって失われた計算しようとします。ところで、すべてのオブジェクトが特定の猶予期間内にオンラインになっている必要がありますので、連絡してください... –

関連する問題