2010-11-29 6 views
1

alle Ich habe eine große Menge an Echtzeitdaten müssen so schnell wie möglich fortfahren.Problem mit großem Speicher in C#

Diese Daten stammen von mehreren Netzwerkverbindungs-Threads.

Alle Netzwerk-Threads übergeben die Daten an eine gemeinsam genutzte Funktion, um eine Übersetzung und Interpretation für die wiederbelebten Daten durchzuführen. Anschließend werden die Informationen als Objekt für Objekt im Concurrent Dictionary gespeichert.

Das Problem ist, ich habe eine Menge von Abjekten erreichen kann 150K in diesem Wörterbuch gespeichert.

was passiert, wenn das Objekt zum Aktualisieren abgerufen wird, dauert es viel länger als die akzeptierte Zeit.

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; 
     } 
     }); 
    }); 
} 
} 

Jetzt während ich mit mehr als 30K Objekte arbeite, gibt es mir verlorene Objekte. Bitte brauche ich dringend

Die Logik ist, dass ich die Objekt Gnade Zeitraum von der aktuellen Systemzeit subtrahieren und vergleichen Sie es mit der letzten Update-Zeit für das Objekt. Glauben Sie, dass diese Art von threadsicherem Array (Dictionary) nicht mit dieser großen Datenmenge umgehen kann und zu Lese-/Schreibzugriffsverzögerungen führt, die zum Verlust von Objekten führen ??? , bevor ich mit List und Lock (Object) {} den Multi-Thread-Zugriff auf diesen gemeinsamen Speicher zu behandeln, aber es nach 10K von Objekten fehlschlägt. nach dem Ändern in Wörterbuch (. Net in Thread sichere Liste erstellen) funktioniert es gut mit 30K. Mein Ziel ist 150K zu erreichen, kann ich es mit dieser Logik erreichen oder Sie haben bessere Ideen.

+0

Ihr Code wird nicht kompiliert - 'UpdateTime> DateTime.Now.AddSeconds (-20000)' ist ungültig, da die LHS ein Int und die RHS eine DateTime ist. Wenn wir keinen echten Code sehen können, ist es schwierig, das Problem zu diagnostizieren. Ebenso sieht Ihr Aufruf zu Parallel.ForEach nicht richtig aus, syntaktisch ... –

+0

Ich korrigierte es gut, es tut mir leid, es war ein Fehler bei der Veröffentlichung, der Code hat einen logischen Fehler, anstatt alles syntaktisch gut zu kompilieren. Danke –

+0

Die Logik ist, dass ich die Objektzeitraum von der aktuellen Systemzeit subtrahiere und es mit der letzten Aktualisierungszeit für das Objekt vergleiche. Denken Sie, dass diese Art von threadsicherem Array (Dictionary) nicht mit dieser großen Datenmenge umgehen kann und Lese-/Schreibzugriffsverzögerungen verursacht, die zum Verlust von Objekten führen ??? bevor ich List und Lock (Object) {} verwendet habe, um den Multi-Thread-Zugriff auf diesen gemeinsamen Speicher zu behandeln, aber es scheitert nach 10K von Objekten. nach dem Ändern in Wörterbuch (. Net in Thread-Liste integriert) funktioniert es gut mit 30K. mein Ziel ist es, 150K –

Antwort

3

Also, für jedes Objekt, das Sie hinzufügen (30K Objekte), erstellen Sie einen Timer. Das sind 30.000 Timer aktiv.

Ich denke, das schafft eine Menge Overhead.

Wenn dies nur für Protokollierung/Audit ist, sollten Sie dies in 1 Timer tun. Erstellen Sie möglicherweise eine separate Liste/ein Verzeichnis von Objekten, die Sie protokollieren möchten.

+0

zu erreichen Danke, ich werde versuchen, jeden Objekt-Timer zu entfernen und durch den globalen Timer anstelle des alten Timers zu berechnen. Übrigens müssen alle Objekte innerhalb einer bestimmten Schonfrist online sein, bitte bleiben Sie in Kontakt ... –