一些想法。
MSMQ(微软消息队列)
您可以让一个线程从 MSMQ 出列并动态更新指标。如果您需要存储这些事件以供以后使用,您可以在将它们出列时将它们放入数据库中。 MSMQ 在这些场景中表现出更好的可伸缩性——尤其是当发布者和订阅者具有不对称的处理速度时;并且正在使用二进制数据(因为 SQL 可能会因为 VARBINARY 分配空间或为索引分配/拆分页面而陷入困境)。
另外两个 SQL 场景是对这个场景的补充——你仍然可以使用出队插入到 SQL 中;以避免在 SQL 分配空间时模拟中出现任何问题。
您可以在一定程度上避开@Aliostad 所说的话。
OLAP(在线分析处理)
听起来您可能会从 OLAP(多维数据集等)中受益。这将增加模拟的整体运行时间,但会提高数据的价值。不幸的是,这意味着要花钱购买更大的 SQL 版本之一。
存储过程
虽然 Linq-to-SQL 非常适合“普通开发人员”,但请在科学项目中远离它。除了能够检查查询计划之外,您还可以在原始 TSQL 中使用许多很棒的技巧。如果您希望获得最佳性能,请仔细规划您的数据库并创建存储过程/UDF 来聚合您的数据。
如果您只能在 C# 中计算某些指标,请事先在 SQL 中做同样多的工作 - 然后随意使用 Linq-to-SQL 来获取数据。
还请记住,如果您在 MSMQ 的末尾插入,您可以积极索引,这将加快您的指标计算,而不会影响您的模拟。
如果确实需要更好的内存利用率(即您实际上已经用完了它),我只会使用 SQL。
内存映射文件
这允许您抵消磁盘上的内存压力;如果需要重新“分页”,则会降低性能。
总体
我可以避开 Linq 来定义基本指标 - 在 SQL 中进行。在这种情况下,MSMQ 无疑是一个巨大的赢家。如果您没有耗尽内存,请不要过度复杂化内存问题并将其保留在 .Net 中。