Bu temelde bir p2p sohbet ağında paket sayısını ve paket türünü, vb. Sayan bir günlük / sayım uygulamasıdır. Bu, 5 dakikalık bir sürede yaklaşık 4-6 milyon pakete eşittir. Ve bu bilgilerin yalnızca bir "anlık görüntüsünü" aldığım için, her beş dakikada bir 5 dakikadan daha eski paketleri kaldırıyorum. Bu nedenle, bu koleksiyonda yer alacak maksimum öğe sayısı 10 ila 12 milyon arasındadır.
Farklı superpeers için 300 bağlantı yapmam gerektiğinden, her paketin en az 300 kez eklenmeye çalışılması olasılığı vardır (muhtemelen bu veriyi bellekte tutmak tek makul seçenektir).
Şu anda, bu bilgileri saklamak için bir Sözlük kullanıyorum. Ancak depolamaya çalıştığım çok sayıda öğe nedeniyle, büyük nesne yığınıyla ilgili sorunlar yaşıyorum ve bellek kullanımı miktarı zamanla sürekli artıyor.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
Mysql kullanmayı denedim, ancak (yinelenmediğinden emin olmak için kontrol ederken) eklemek için gereken veri miktarına yetişmek mümkün değildi ve bu işlemleri kullanırken oldu.
Mongodb'u denedim, ama bunun için cpu kullanımı deliydi ve ya tutmadı.
Ana sorunum her 5 dakikada bir ortaya çıkıyor, çünkü 5 dakikadan daha eski olan tüm paketleri kaldırıyorum ve bu verilerin "anlık görüntüsünü" alıyorum. Belirli bir paket türü içeren paket sayısını saymak için LINQ sorguları kullanıyorum gibi. Ben de keyvaluepair'ın anahtarından 4 bayt (ip adresi) şerit ve anahtar değer değeri değerinde requestingport değeri ile birleştirmek ve farklı bir sayı elde etmek için kullanmak veri ayrı bir () sorgusu çağırıyorum tüm paketlerden akranları.
Uygulama şu anda yaklaşık 1,1 GB bellek kullanımı barındırıyor ve bir anlık görüntü çağrıldığında, kullanımı iki katına çıkaracak kadar ileri gidebiliyor.
Eğer çılgınca bir miktar koç varsa, bu bir sorun olmaz, ama bu çalıştığım vm şu anda 2GB koç ile sınırlıdır.
Kolay bir çözüm var mı?