对于这种每秒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之类的东西吗?
如果您只是想要所有数据的日志,以便在重新启动时恢复状态,那么简单的平面文件就可以了。只要对写操作进行缓冲,任何系统都可以保持每秒1MB的写入速度。但是,如果你要做随机访问,那就是另一回事了。
您提到您将有10k插入每秒。即使没有读(只写),也需要大量的工作和相当昂贵的硬件来获得随机访问的带宽。
因为你只需要保存一个小时的数据(36M条记录),所以将数据存储在内存中可能会便宜得多,也更容易。假设存储一条记录的所有数据需要100字节,那么您只需要额外的4GB。因为仅仅存储数据就需要4GB的空间,所以我假设您有一台64位的机器。
您当前的ConcurrentDictionary<uint[], PrimaryPacket>
实现存在一些问题。
首先,使用uint[]
作为字典键是一个坏主意,因为具有相同内容的两个不同数组不被认为是相等的——您将永远无法在字典中查找任何内容!由于密钥是8字节,我建议使用struct
,如ulong
、KeyValuePair<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写过一些东西,它非常适合大批量的写作。