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

本文关键字:情况 数据库 是什么 插入 于这种 000次 | 更新日期: 2023-09-27 18:10:42

我有一个应用程序需要保存大量这种类型的类/信息:

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;
}

目前我正在使用它来存储项目,关键是IPAddress和requesttid在一个int[]数组:

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

然而,我需要存储的这些非常大的数量是每秒大约10,000个新条目(最多保存一个小时),内存使用变得疯狂。

如果我使用一个数据库,它会更有效(和更少的内存消耗)吗?我应该使用mysql或mongodB之类的东西吗?

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

如果您只是想要所有数据的日志,以便在重新启动时恢复状态,那么简单的平面文件就可以了。只要对写操作进行缓冲,任何系统都可以保持每秒1MB的写入速度。但是,如果你要做随机访问,那就是另一回事了。

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

因为你只需要保存一个小时的数据(36M条记录),所以将数据存储在内存中可能会便宜得多,也更容易。假设存储一条记录的所有数据需要100字节,那么您只需要额外的4GB。因为仅仅存储数据就需要4GB的空间,所以我假设您有一台64位的机器。

您当前的ConcurrentDictionary<uint[], PrimaryPacket>实现存在一些问题。

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

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

10000/秒?!我希望这只是短时间内的交易,否则每天就会达到8.64亿美元(占eBay日交易量的86%)。我总是推荐像这样的大容量数据库转储。

查看:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

我用Cassandra写过一些东西,它非常适合大批量的写作。

相关文章: