Il s'agit essentiellement d'une application de journalisation / comptage qui compte le nombre de paquets et le type de paquet, etc. sur un réseau de discussion p2p. Cela équivaut à environ 4 à 6 millions de paquets sur une période de 5 minutes. Et parce que je ne prends qu'un "instantané" de ces informations, je ne supprime que les paquets de plus de 5 minutes toutes les cinq minutes. Donc, le maximum d'articles qui seront dans cette collection est de 10 à 12 millions.
Étant donné que je dois établir 300 connexions avec différents super-utilisateurs, il est possible que chaque paquet essaie d'être inséré au moins 300 fois (c'est probablement la raison pour laquelle la conservation de ces données en mémoire est la seule option raisonnable).
Actuellement, j'utilise un dictionnaire pour stocker ces informations. Mais en raison de la grande quantité d'articles que j'essaie de stocker, je rencontre des problèmes avec le tas d'objets volumineux et la quantité d'utilisation de la mémoire augmente continuellement au fil du temps.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
J'ai essayé d'utiliser mysql, mais il n'a pas pu suivre la quantité de données que j'ai besoin d'insérer (tout en vérifiant qu'il ne s'agissait pas d'un doublon), et c'était lors de l'utilisation de transactions.
J'ai essayé mongodb, mais l'utilisation du processeur pour cela était folle et je ne l'ai pas gardée non plus.
Mon principal problème survient toutes les 5 minutes, car je supprime tous les paquets qui datent de plus de 5 minutes et je prends un "instantané" de ces données. Comme j'utilise des requêtes LINQ pour compter le nombre de paquets contenant un certain type de paquet. J'appelle également une requête distinct () sur les données, où je supprime 4 octets (adresse IP) de la clé de keyvaluepair, et la combine avec la valeur requestingport dans la valeur de keyvalupair et l'utilise pour obtenir un nombre distinct de pairs de tous les paquets.
L'application oscille actuellement autour de 1,1 Go d'utilisation de la mémoire, et lorsqu'un instantané est appelé, il peut aller jusqu'à doubler l'utilisation.
Maintenant, ce ne serait pas un problème si j'ai une quantité folle de RAM, mais le vm sur lequel je tourne est limité à 2 Go de RAM pour le moment.
Existe-t-il une solution simple?