Dies ist im Grunde eine Protokollierungs- / Zählanwendung, die die Anzahl der Pakete und den Pakettyp usw. in einem P2P-Chat-Netzwerk zählt. Dies entspricht ungefähr 4-6 Millionen Paketen in einem Zeitraum von 5 Minuten. Und weil ich nur einen "Schnappschuss" dieser Informationen mache, entferne ich nur alle fünf Minuten Pakete, die älter als 5 Minuten sind. Die maximale Anzahl der Artikel in dieser Sammlung liegt bei 10 bis 12 Millionen.
Da ich 300 Verbindungen zu verschiedenen SuperPeers herstellen muss, ist es möglich, dass jedes Paket mindestens 300 Mal versucht, eingefügt zu werden.
Derzeit verwende ich ein Wörterbuch zum Speichern dieser Informationen. Aufgrund der großen Anzahl von Elementen, die ich speichern möchte, treten jedoch Probleme mit dem großen Objekthaufen auf, und die Speichernutzung nimmt im Laufe der Zeit kontinuierlich zu.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
Ich habe versucht, mysql zu verwenden, aber es war nicht in der Lage, mit der Datenmenge Schritt zu halten, die ich einfügen musste (während ich überprüfte, ob es sich um ein Duplikat handelte), und das während der Verwendung von Transaktionen.
Ich habe mongodb ausprobiert, aber die CPU-Auslastung dafür war verrückt und hat auch nicht gehalten.
Mein Hauptproblem tritt alle 5 Minuten auf, weil ich alle Pakete entferne, die älter als 5 Minuten sind, und einen "Schnappschuss" dieser Daten mache. Da ich LINQ-Abfragen verwende, um die Anzahl der Pakete zu zählen, die einen bestimmten Pakettyp enthalten. Ich rufe auch eine distinct () - Abfrage für die Daten auf, bei der ich 4 Bytes (IP-Adresse) aus dem Schlüssel des Schlüsselpaars entferne und diese mit dem Wert für requestingport im Wert des Schlüsselpaars kombiniere, um eine eindeutige Anzahl von zu erhalten Peers von allen Paketen.
Die Anwendung verwendet derzeit etwa 1,1 GB Arbeitsspeicher, und wenn ein Snapshot aufgerufen wird, kann er die Auslastung verdoppeln.
Nun, das wäre kein Problem, wenn ich eine verrückte Menge an RAM habe, aber die VM, auf der ich das lauffähig habe, ist im Moment auf 2 GB RAM begrenzt.
Gibt es eine einfache Lösung?