Questa è fondamentalmente un'applicazione di conteggio / conteggio che sta contando il numero di pacchetti e contando il tipo di pacchetto, ecc. su una rete di chat p2p. Ciò equivale a circa 4-6 milioni di pacchetti in un periodo di 5 minuti. E poiché prendo solo una "istantanea" di queste informazioni, rimuovo solo pacchetti più vecchi di 5 minuti ogni cinque minuti. Pertanto, il massimo degli elementi che saranno presenti in questa raccolta è compreso tra 10 e 12 milioni.
Dato che ho bisogno di creare 300 connessioni con superpoteri diversi, è una possibilità che ogni pacchetto stia tentando di essere inserito almeno 300 volte (il che probabilmente è il motivo per cui tenere questi dati in memoria è l'unica opzione ragionevole).
Attualmente, sto usando un dizionario per memorizzare queste informazioni. Ma a causa della grande quantità di elementi che sto cercando di archiviare, mi imbatto in problemi con l'heap degli oggetti di grandi dimensioni e la quantità di utilizzo della memoria cresce continuamente nel tempo.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
Ho provato a utilizzare mysql, ma non è stato in grado di tenere il passo con la quantità di dati che ho bisogno di inserire (durante il controllo per assicurarmi che non fosse un duplicato), e ciò mentre usavo le transazioni.
Ho provato mongodb, ma l'uso della CPU per quello era pazzo e non lo tenevo neanche.
Il mio problema principale si verifica ogni 5 minuti, perché rimuovo tutti i pacchetti che sono più vecchi di 5 minuti e scatta una "istantanea" di questi dati. Poiché sto utilizzando query LINQ per contare il numero di pacchetti contenenti un determinato tipo di pacchetto. Sto anche chiamando una query distinta () sui dati, dove spoglio 4 byte (indirizzo ip) dalla chiave keyvaluepair, e combinalo con il valore requestingport nel valore del keyvalupair e lo uso per ottenere un numero distinto di colleghi da tutti i pacchetti.
L'applicazione al momento si aggira intorno a 1,1 GB di utilizzo della memoria e, quando viene chiamata un'istantanea, può arrivare a raddoppiare l'utilizzo.
Ora questo non sarebbe un problema se avessi una quantità folle di ram, ma il vm su cui sto girando è limitato a 2GB di ram al momento.
C'è una soluzione facile?