Questa è fondamentalmente un'applicazione di registrazione / 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 i pacchetti più vecchi di 5 minuti ogni cinque minuti. Quindi il massimo degli articoli che saranno in questa raccolta è da 10 a 12 milioni.
Poiché ho bisogno di effettuare 300 connessioni a diversi superpeer, è possibile che ogni pacchetto stia cercando di essere inserito almeno 300 volte (motivo per cui probabilmente 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 oggetti che sto cercando di archiviare, ho riscontrato problemi con l'heap di oggetti di grandi dimensioni e la quantità di utilizzo della memoria aumenta 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 devo inserire (verificando per accertarmi che non fosse un duplicato), e che era durante l'utilizzo delle transazioni.
Ho provato mongodb, ma l'utilizzo della cpu per questo era folle e non ha tenuto neanche.
Il mio problema principale si presenta ogni 5 minuti, perché rimuovo tutti i pacchetti più vecchi di 5 minuti e faccio uno "snapshot" di questi dati. Come sto usando le query LINQ per contare il numero di pacchetti contenenti un determinato tipo di pacchetto. Sto anche chiamando una query distinta () sui dati, in cui rimuovo 4 byte (indirizzo IP) dalla chiave del keyvaluepair e lo combino con il valore di richiesta richiedente nel valore del keyvalupair e lo uso per ottenere un numero distinto di colleghi di tutti i pacchetti.
L'applicazione attualmente copre circa 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 al momento il vm su cui ho in esecuzione è limitato a 2 GB di RAM.
C'è qualche soluzione semplice?