Este é basicamente um aplicativo de registro / contagem que conta o número de pacotes e o tipo de pacote etc. em uma rede de bate-papo p2p. Isso equivale a cerca de 4-6 milhões de pacotes em um período de 5 minutos. E como eu tiro apenas um "instantâneo" dessas informações, apenas removo pacotes com mais de 5 minutos a cada cinco minutos. Portanto, o máximo de itens que estarão nesta coleção é de 10 a 12 milhões.
Como preciso fazer 300 conexões com diferentes superpeers, é possível que cada pacote esteja tentando ser inserido pelo menos 300 vezes (e é provavelmente por isso que manter esses dados na memória é a única opção razoável).
Atualmente, estou usando um dicionário para armazenar essas informações. Mas, devido à grande quantidade de itens que estou tentando armazenar, encontro problemas com a pilha de objetos grandes e a quantidade de uso de memória aumenta continuamente ao longo do 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;
}
Eu tentei usar o mysql, mas ele não foi capaz de acompanhar a quantidade de dados que eu preciso inserir (enquanto verificava para garantir que não era uma duplicata), e isso enquanto usava transações.
Eu tentei o mongodb, mas o uso da CPU era insano e não o mantinha.
Meu problema principal surge a cada 5 minutos, porque removo todos os pacotes com mais de 5 minutos e tiro um instantâneo desses dados. Como eu estou usando consultas LINQ para contar o número de pacotes que contêm um determinado tipo de pacote. Também estou chamando uma consulta distinta () nos dados, em que retiro 4 bytes (endereço IP) da chave do keyvaluepair e a combino com o valor requestingport no valor do keyvalupair e o uso para obter um número distinto de pares de todos os pacotes.
Atualmente, o aplicativo mantém em torno de 1,1 GB de uso de memória e, quando um instantâneo é chamado, pode chegar ao ponto de duplicar o uso.
Agora, isso não seria um problema se eu tiver uma quantidade insana de RAM, mas a vm em que estou executando esta limitada a 2 GB de RAM no momento.
Existe alguma solução fácil?