Це в основному додаток для реєстрації / підрахунку, який підраховує кількість пакетів і підраховує тип пакету тощо в мережі чату 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-адресу) з ключа ключового значення параметри і поєдную його зі запитомпортового значення у Значенні ключового значення та використовую, щоб отримати чітке число колеги з усіх пакетів.
Зараз у програмі розміщено близько 1,1 ГБ пам’яті, а коли буде зроблено знімок, це може зайняти вдвічі більше.
Тепер це не буде проблемою, якщо у мене є божевільна кількість оперативної пам’яті, але vm, на якому я працюю, наразі обмежений 2 ГБ оперативної пам’яті.
Чи є якесь просте рішення?