gpt4 book ai didi

c# - 对于这种每秒 10,000 次插入的情况,最好的数据库是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 20:12:12 24 4
gpt4 key购买 nike

我有一个应用程序需要保存大量此类类/信息:

public struct PrimaryPacket
{
public uint IPAddress;
public ushort UDPPort;
public ushort TCPPort;
public uint RequestID;
public byte Hop;
public byte FreePrimaries;
public byte FreeSecondaries;
public ushort Length;
public byte[] Data;
}

目前我正在使用它来存储项目,键是 uint[] 数组中的 IPAddress 和 RequestID:

ConcurrentDictionary<uint[], PrimaryPacket> Packets = new ConcurrentDictionary<uint[], PrimaryPacket>();

但是,我需要存储的这些数据量非常大,大约每秒 10,000 个新项目(保存它们最多一小时)并且内存使用量变得疯狂。

如果我为此使用数据库,它会不会更高效(并且更少占用内存)?我应该考虑使用 mysql 还是类似 mongodB 的东西?

最佳答案

如果您只需要所有数据的日志,以便在重启时恢复您的状态,那么一个简单的平面文件就可以了。只要您缓冲写入,任何系统都可以跟上 1MB/秒的写入速度。但是,如果您要进行随机访问,那就另当别论了。

您提到您每秒将进行 10k 次插入。即使没有读取(只写),也需要大量的工作和相当昂贵的硬件才能获得这种用于随机访问的带宽。

由于您只会保留一个小时的数据(3600 万条记录),因此将数据存储在内存中可能会更便宜、更容易。假设存储一条记录的所有数据需要 100 个字节,那么您只需要额外的 4GB。因为它只需要 4GB 来存储数据,所以我假设您有一台 64 位机器。

您当前对 ConcurrentDictionary<uint[], PrimaryPacket> 的实现但是有一些问题。

首先,使用 uint[]作为字典键是一个坏主意,因为两个具有相同内容的不同数组被认为是不相等的——你永远无法在你的字典中查找任何东西!由于 key 是 8 个字节,我建议使用 struct例如ulong , KeyValuePair<uint, uint> ,或自定义的。我不推荐 Tuple<uint, uint>因为它会有大约 24 字节的开销。

其次,看起来您可能正在定义 PrimaryPacket作为 struct .对于这么大的对象,您可能会发现将其定义为 class 可以获得更好的性能。 .

关于c# - 对于这种每秒 10,000 次插入的情况,最好的数据库是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com