Esto es básicamente una aplicación de registro / conteo que cuenta el número de paquetes y el tipo de paquete, etc. en una red de chat p2p. Esto equivale a unos 4-6 millones de paquetes en un período de 5 minutos. Y debido a que solo tomo una "instantánea" de esta información, solo estoy eliminando paquetes de más de 5 minutos cada cinco minutos. Entonces, la cantidad máxima de artículos que estarán en esta colección es de 10 a 12 millones.
Debido a que necesito hacer 300 conexiones a diferentes superpeers, es una posibilidad que cada paquete intente insertarse al menos 300 veces (lo que probablemente sea la razón por la cual mantener estos datos en la memoria es la única opción razonable).
Actualmente, he estado usando un diccionario para almacenar esta información. Pero debido a la gran cantidad de elementos que estoy tratando de almacenar, me encuentro con problemas con el montón de objetos grandes y la cantidad de uso de memoria crece continuamente con el tiempo.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
Intenté usar mysql, pero no pude mantener la cantidad de datos que necesito insertar (mientras lo comprobaba para asegurarme de que no era un duplicado), y eso fue mientras usaba las transacciones.
Intenté mongodb, pero el uso de la CPU para eso fue una locura y tampoco se mantuvo.
Mi problema principal surge cada 5 minutos, porque elimino todos los paquetes que tienen más de 5 minutos y tomo una "instantánea" de estos datos. Como estoy usando consultas LINQ para contar el número de paquetes que contienen un determinado tipo de paquete. También estoy llamando a una consulta distinta () en los datos, donde elimino 4 bytes (dirección IP) de la clave del keyvaluepair, y lo combino con el valor del puerto solicitante en el Valor del keyvalupair y lo uso para obtener un número distinto de pares de todos los paquetes.
Actualmente, la aplicación oscila alrededor de 1,1 GB de uso de memoria, y cuando se llama una instantánea, puede llegar a duplicar el uso.
Ahora, esto no sería un problema si tengo una cantidad increíble de ram, pero la vm en la que estoy ejecutando está limitada a 2GB de ram en este momento.
¿Hay alguna solución fácil?