Это в основном приложение для регистрации / подсчета, которое подсчитывает количество пакетов, подсчитывает тип пакета и т. Д. В сети чата p2p. Это соответствует примерно 4-6 миллионам пакетов за 5 минут. И поскольку я делаю только «снимок» этой информации, я удаляю только пакеты старше 5 минут каждые пять минут. Таким образом, максимальное количество предметов, которые будут в этой коллекции, составляет от 10 до 12 миллионов.
Поскольку мне нужно сделать 300 подключений к разным супер-суперпользователям, возможно, что каждый пакет пытается быть вставлен как минимум 300 раз (возможно, поэтому хранение этих данных в памяти является единственно разумным вариантом).
В настоящее время я использую словарь для хранения этой информации. Но из-за большого количества элементов, которые я пытаюсь сохранить, у меня возникают проблемы с кучей больших объектов, и объем использования памяти постоянно растет со временем.
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, но он не смог справиться с объемом данных, которые мне нужно вставить (при проверке, чтобы убедиться, что это не дубликат), и это было при использовании транзакций.
Я попробовал mongodb, но использование процессора для этого было безумным и не сохранилось.
Моя основная проблема возникает каждые 5 минут, потому что я удаляю все пакеты старше 5 минут и делаю «снимок» этих данных. Поскольку я использую запросы LINQ для подсчета количества пакетов, содержащих определенный тип пакета. Я также вызываю отдельный запрос () для данных, где я удаляю 4 байта (ip-адрес) из ключа keyvaluepair и объединяю его со значением requesttingport в значении keyvalupair и использую его для получения различного числа peers из всех пакетов.
В настоящее время приложение использует около 1,1 ГБ памяти, и при вызове моментального снимка оно может удвоиться.
Теперь это не будет проблемой, если у меня будет безумное количество оперативной памяти, но виртуальный компьютер, на котором я работаю, ограничен 2 ГБ оперативной памяти.
Есть ли простое решение?