.net 对19710个项目的ConcurrentDictionary的LINQ查询

.net 对19710个项目的ConcurrentDictionary的LINQ查询,.net,linq,optimization,dictionary,.net,Linq,Optimization,Dictionary,我有以下方法: /// <summary> /// Calculates the last trade date. /// </summary> /// <param name="tradesDictionary">The trades dictionary.</param> /// <returns>The last trade date.</returns> public

我有以下方法:

    /// <summary>
    /// Calculates the last trade date.
    /// </summary>
    /// <param name="tradesDictionary">The trades dictionary.</param>
    /// <returns>The last trade date.</returns>
    public DateTime CalculateLastTradeDate(ConcurrentDictionary<Guid, TradeRecord> tradesDictionary)
    { 
        // Calculate the last trade date
        _lastTradeDate = (from tradeRecord in tradesDictionary
                          where (tradeRecord.Value.OrderRecord.PairRecord.Id == _pairId)
                          select tradeRecord.Value.Date)
                         .Max();
        // Return _lastTradeDate
        return _lastTradeDate;
    }
//
///计算最后交易日期。
/// 
///贸易词典。
///最后的交易日期。
public DateTime CalculatesTTradeDate(ConcurrentDictionary交易字典)
{ 
//计算最后交易日期
_lastTradeDate=(来自tradesDictionary中的tradeRecord
其中(tradeRecord.Value.OrderRecord.PairRecord.Id==\u pairId)
选择tradeRecord.Value.Date)
.Max();
//返回\u lastTradeDate
返回_lastTradeDate;
}
这需要+-129秒,即+-2分钟才能对内存中的21353对象的ConcurrentDictionary执行。在用上述方法实现的查询中,我能做些什么来大幅减少它的执行时间吗


任何帮助都将不胜感激

首先要注意的是,您实际上并没有在
ConcurrentDictionary
或与之相关的任何东西上执行大部分查询。您正在列表中的值副本上执行此操作

我的第一个调用端口是计算时间的去向-将
tradesDictionary.Values.ToList()调用与查询的其余部分分开。4分钟听起来确实有些过头了。一旦你知道哪一个部分引起了这个问题,我会考虑使用非并行查询,只是为了比较的目的。< /P>
除此之外,这实际上取决于记录的各种属性在做什么。他们是在访问数据库还是类似的东西?您的计算机在这四分钟内是处于空闲状态,还是全速运行

我确实觉得你并不需要订购整套——你只需要找到最小值。然而,这只会使复杂性从O(n logn)增加到O(n),而且在“普通”LINQ到对象或并行LINQ中进行比较困难

TradeRecord.OrderRecord.PairRecord

看起来涉及到三个级别的数据库记录。您是否100%确定所有记录都在内存中?您是通过设置datacontext的log属性来检查的,还是通过检查sql profiler来检查的?

从这里的信息中,我发现只需查询数据库就可以更有效地获得最大交易日期

SELECT MAX(TradeRecordTable.Date) AS MaxTradeDate
FROM   <appropriate table join>
WHERE  PairRecordTable.Id = _pairId
选择MAX(TradeRecordTable.Date)作为MaxTradeDate
从…起
其中PairRecordTable.Id=\u pairId

如果PairRecordTable中匹配行的数量不多,则应该很快运行。我意识到这可能不是你的解决方案有很多原因。但我也经常看到简单的解决方案被忽视。

嗨,乔恩。我将查询更改为使用Max,而不转换为列表。查询性能提高了100%,但是-2分钟仍然太慢了!还有什么我可以试试的吗?没有对数据库做任何操作。对象都存储在内存中。请看我对原始问题所做的更改。Values.ToList(),甚至只是Values,都会临时锁定集合中的每个元素,不是吗?然而他的代码利用了IEnumerable,我认为这会在幕后调用GetEnumerator,哪一个更好呢@RJB:自从我回答这个问题以来,这个问题已经发生了变化(非常显著,而且令人烦恼)。最初的问题称为
Values
ToList()
。我将很快删除这个答案,因为它对修改后的问题毫无意义。嗨,大卫。你让我朝着正确的方向思考。这些对象都存储在内存中,但在这些外部对象上具有延迟加载功能。每次调用TradeRecord.OrderRecord.PairRecord时,都会在下面查找数据库。非常感谢-这是我给你带来的问题之一!