Jest to w zasadzie aplikacja do rejestrowania / zliczania, która zlicza liczbę pakietów i typ pakietu itp. W sieci czatu p2p. Odpowiada to około 4-6 milionom pakietów w ciągu 5 minut. A ponieważ robię tylko „migawkę” tych informacji, usuwam tylko pakiety starsze niż 5 minut co pięć minut. Zatem maksymalna liczba przedmiotów, które będą w tej kolekcji, wynosi od 10 do 12 milionów.
Ponieważ muszę nawiązać 300 połączeń z różnymi supereperami, istnieje możliwość, że każdy pakiet próbuje wstawić co najmniej 300 razy (prawdopodobnie dlatego właśnie zatrzymywanie tych danych w pamięci jest jedyną rozsądną opcją).
Obecnie używam Słownika do przechowywania tych informacji. Ale z powodu dużej ilości przedmiotów, które próbuję przechowywać, mam problemy ze stertą dużych obiektów, a ilość pamięci stale rośnie z czasem.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
Próbowałem użyć mysql, ale nie był w stanie nadążyć za ilością danych, które muszę wstawić (sprawdzając, czy nie jest to duplikat), i to było podczas korzystania z transakcji.
Próbowałem mongodb, ale użycie procesora do tego celu było szalone i też tego nie utrzymałem.
Mój główny problem pojawia się co 5 minut, ponieważ usuwam wszystkie pakiety starsze niż 5 minut i robię „migawkę” tych danych. Ponieważ używam zapytań LINQ do zliczenia liczby pakietów zawierających określony typ pakietu. Wywołuję także odrębne () zapytanie dotyczące danych, w którym usuwam 4 bajty (adres IP) z klucza keyvaluepair i łączę go z wartością port-żądania w wartości klucza-wartości i używam tego, aby uzyskać odrębną liczbę rówieśnicy ze wszystkich pakietów.
Aplikacja oscyluje obecnie wokół 1,1 GB pamięci, a gdy wywoływana jest migawka, może sięgać nawet dwukrotnie.
Teraz nie byłoby problemu, gdybym miał szaloną ilość pamięci RAM, ale vm, na którym mam to działa, jest obecnie ograniczony do 2 GB pamięci RAM.
Czy jest jakieś łatwe rozwiązanie?