这基本上是一个日志记录/计数应用程序,它在p2p聊天网络上统计数据包的数量并统计数据包的类型等。这相当于在5分钟内大约有4-6百万个数据包。并且因为我仅对此信息进行“快照”,所以我仅每5分钟删除5分钟之前的数据包。因此,此收藏集中的物品数量上限约为10到1200万。
因为我需要与不同的超级对等方建立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,但是该CPU的使用非常疯狂,并且没有保持任何状态。
我的主要问题是每5分钟出现一次,因为我会删除所有早于5分钟的数据包,并对该数据进行“快照”。当我使用LINQ查询来计算包含某种数据包类型的数据包的数量时。我还对数据调用了一个distinct()查询,在该查询中,我从键值对的键中剥离了4个字节(IP地址),并将其与键值对的值中的requestingport值组合在一起,并使用该值来获得不同数量的所有数据包的对等体。
该应用程序当前的内存使用量徘徊在1.1GB左右,并且在调用快照时,它甚至可以使使用量翻倍。
现在,如果我有大量的ram,这将不是问题,但是目前运行此虚拟机的vm仅限于2GB的ram。
有什么简单的解决方案吗?