LINQ查询19710项目的ConcurrentDictionary缓慢

时间:2010-10-04 07:41:15

标签: .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 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;
    }

需要+ - 129秒,即 + - 2分钟才能在内存中 21353 对象的ConcurrentDictionary上执行。在上述方法实现的查询中,我能做些什么,大大减少它的执行时间?

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

嗯,首先要注意的是,你 并非真正在ConcurrentDictionary上执行大部分查询或与之相关的任何事情。您是在列表中的值副本上进行的。

我的第一个停靠点是找出时间进展的地方 - 从查询的其余部分中分离出tradesDictionary.Values.ToList()来电。虽然4分钟听起来像方式。一旦你找出导致问题的部分,我会考虑使用非并行查询,仅用于比较目的。

除此之外,它实际上取决于记录的各种属性在做什么。他们是在访问数据库还是那样的?您的计算机在这四分钟内是否处于空闲状态,或者它是否正在全速运行?

确实让我觉得你并不需要订购整套装置 - 你只需要找到最小值。但是,这应该只考虑从O(n log n)到O(n)的复杂性,并且在“正常”LINQ到对象或并行LINQ中做起来相对困难。

答案 1 :(得分:1)

TradeRecord.OrderRecord.PairRecord

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

答案 2 :(得分:0)

从这里的信息可以看出,通过查询数据库可以更有效地达到最大交易日期。

SELECT MAX(TradeRecordTable.Date) AS MaxTradeDate
FROM   <appropriate table join>
WHERE  PairRecordTable.Id = _pairId

如果PairRecordTable中匹配行的数量不大,则应该非常快速地运行。我发现有很多原因可能不适合你。但我也经常看到这个简单的解决方案被忽视了。