Về cơ bản, đây là một ứng dụng ghi / đếm đang đếm số lượng gói và đếm loại gói, v.v. trên mạng trò chuyện p2p. Điều này tương đương với khoảng 4 - 6 triệu gói trong khoảng thời gian 5 phút. Và bởi vì tôi chỉ chụp "ảnh chụp" thông tin này, nên tôi chỉ xóa các gói cũ hơn 5 phút mỗi năm phút. Vì vậy, tối đa về các mặt hàng sẽ có trong bộ sưu tập này là 10 đến 12 triệu.
Vì tôi cần thực hiện 300 kết nối với các siêu nhân khác nhau, nên có khả năng mỗi gói đang cố gắng chèn ít nhất 300 lần (có lẽ đó là lý do tại sao giữ dữ liệu này trong bộ nhớ là lựa chọn hợp lý duy nhất).
Hiện tại, tôi đang sử dụng một Từ điển để lưu trữ thông tin này. Nhưng vì số lượng lớn các mặt hàng tôi đang cố gắng lưu trữ, tôi gặp phải các vấn đề với đống đối tượng lớn và lượng sử dụng bộ nhớ liên tục tăng theo thời gian.
Dictionary<ulong, Packet>
public class Packet
{
public ushort RequesterPort;
public bool IsSearch;
public string SearchText;
public bool Flagged;
public byte PacketType;
public DateTime TimeStamp;
}
Tôi đã thử sử dụng mysql, nhưng nó không thể theo kịp lượng dữ liệu tôi cần chèn (trong khi kiểm tra để đảm bảo rằng nó không phải là một bản sao) và đó là trong khi sử dụng các giao dịch.
Tôi đã thử mongodb, nhưng việc sử dụng cpu cho điều đó là điên rồ và cũng không giữ được.
Vấn đề chính của tôi phát sinh cứ sau 5 phút, bởi vì tôi xóa tất cả các gói cũ hơn 5 phút và chụp "ảnh chụp" dữ liệu này. Vì tôi đang sử dụng các truy vấn LINQ để đếm số lượng gói chứa một loại gói nhất định. Tôi cũng đang gọi một truy vấn () riêng biệt trên dữ liệu, trong đó tôi tách 4 byte (địa chỉ IP) ra khỏi khóa của keyvaluepair và kết hợp nó với giá trị requestport trong Giá trị của keyvalupair và sử dụng số đó để lấy số khác biệt đồng nghiệp từ tất cả các gói.
Ứng dụng hiện đang dao động khoảng 1,1 GB sử dụng bộ nhớ và khi một ảnh chụp nhanh được gọi, nó có thể tăng gấp đôi mức sử dụng.
Bây giờ điều này sẽ không thành vấn đề nếu tôi có một lượng ram điên rồ, nhưng vm tôi có chạy này bị giới hạn ở mức 2GB ram vào lúc này.
Có giải pháp nào dễ không?