许多DateTime的比较更快

时间:2014-03-18 12:48:00

标签: c# algorithm datetime big-o

在效率方面,我遇到了一项我正在努力解决的任务。我有一个可以拥有数十万笔交易的数据库。人。我的目标是找到通常在彼此附近进行交易的人(人X在人Y的10分钟内进行了交易,在5个不同的场合)。

我正在努力围绕一种有效的方式来解决这个问题。最简单的方法是:

foreach(var doc in db.Transactions.OrderBy(d => d.TransactionID))
{
    foreach(var doc2 in db.Transactions.Where(d => d.TransactionID > doc.TransactionID))
    {
        if(doc2.DateCreated.IsBetween(doc.DateCreated,minutes))
        {
           // hit found  
        }
    }
} 

(TransactionID是一个bigint标识)。获得hits列表后,很容易计算出现次数。但这显然很差。运行时间是 enter image description here在1M +交易中会非常慢。我已经研究了一些算法,但我发现任何适用于我的情况。任何人都可以提供指导,从哪里开始加快速度?

2 个答案:

答案 0 :(得分:5)

几点提示:

  1. 在数据库端执行此操作(例如存储过程) - 即使算法得到改进,加载和处理1M +记录也会产生开销。
  2. 将所有数据分成大小为10分钟的存储分区(假设10分钟是您的检测阈值)。然后,对于每个桶,您只需要检查相邻的桶,这应该减少比较操作的量。
  3. 确保您操作例如节省时间以避免复杂的日期时间操作。

答案 1 :(得分:3)

除了decPL的提示之外,您可能还想设置一个包含交易数据的数据仓库,然后可以在晚上进行分析。这意味着您将有关数据的数据存储在单独的数据库中,然后使用已知算法扫描该数据库的模式。这就是像亚马逊这样的服务提出那些“买了这个,也买了......的人”的建议。

仓库中的数据可以针对快速处理进行优化,因此不需要遵循与实际(“源”)数据库相同的格式。分析过程(报告)的输出也可以采用易于处理的格式,可能使用LINQ,就像您在问题中一样。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Data_warehousehttp://www.1keydata.com/datawarehousing/datawarehouse.html